实现过程 当我们在声明一个类时,编译器会自动帮我们创建一个虚函数表。 比如下面的这段代码: 编译器为我们生成的虚函数表 虚函数表: 虚函数表是由编译器自动产生的一种存储类成员函数的一种数据结构。其中虚函数会被自动放入表中。 那编译器是怎么找到虚函数表呢? 原来当我们当我们用类定义对象的时候,编译器内部会为成员结构体变量中增加一个指向虚函数表的指针 (vptr),当我们通过函数形参将子类传进来的时候,编译器首先会判断所传形参的数据类型,如果调用的函数具有virtual关键字,编译器会通过vptr指针,找到相应的虚函数表,继而找到相应的虚函数,达到所谓的迟绑定状态,即动态联编。如果不具有virtual关键字,编译器可直接确定被调用的成员函数,即静态联编。 作者:Cxinsect 发表于 2018/10/26 16:09:24 原文链接 https://blog.csdn.net/Cxinsect/ 继续阅读 >>


陈新 18/10/26 16:09:24
以前总是以为读写锁是两把锁,感觉这个和进程的管道通信差不多。既然进程有读端和写端,那么想当然的就认为读写锁就是读锁和写锁两把锁,接触到这个概念后才觉得自己还是flag立得太早了 相关概念 读写锁实际是一种特殊的自旋锁,它把对共享资源的访问者划分成读者和写者,读者只对共享资源进行读访问,写者则需要对共享资源进行写操作。 特性 线程A加读锁成功,线程B,C加读锁,可以加锁成功 线程A加写锁成功,线程B,C加读锁,B,C阻塞。 线程A加读锁成功,线程B加写锁阻塞,C线程加读锁阻塞。 上面的特性我们可以概括为读的共享性,写的独占性 即读操作是并行的,写操作是串行的,并且写操作的优先级要高于读操作。 相关函数 #include <pthread.h> int pthread_rwlock_init(pthread_rwlock_t *restrict rwlock, const pthread_rwlockattr_t *restrict attr); 继续阅读 >>


陈新 18/08/12 23:35:42
相关函数 #include <pthread.h> /*头文件*/ int pthread_mutex_init(pthread_mutex_t *mutex, const pthread_mutexattr_t *mutexattr); /*初始化一个互斥锁*/ int pthread_mutex_destroy(pthread_mutex_t *mutex);/*注销一个互斥锁*/ int pthread_mutex_lock(pthread_mutex_t *mutex); /*加锁,不成功,阻塞等待*/ int pthread_mutex_unlock(pthread_mutex_t *mutex);/*解锁*/ int pthread_join(pthread_t th,void *thread_return); /*等待线程结束*/ int pthread_cond_init(pthread_cond_t *cond,pthread_condattr_t *cond 继续阅读 >>


陈新 18/08/12 12:20:58
我们知道做什么事情都是有始有终,在编程中也是一样。在Linux中创建一个进程后,程序的末尾我们要将其退出,在Linux中进程退出总共有八种方法,本篇文章主要讲解其中两个函数。 调用格式 #include<stdio.h> #include<unistd.h> void exit(int status); void _exit(int status); exit系列函数并没有返回值,它使用一个叫做终止状态的整型变量作为参数,内核会对这个终止状态进行检查,异常终止时,内核会直接产生一个终止状态字,描述异常终止的原因。对于终止状态字,我们可以调用wait或者waitpid函数来获取,有兴趣的小伙伴可以翻阅相关资料。 调用过程 调用过程如图所示,从图中可以看出: _exit函数直接使进程停止,清除其使用的内存空间,和内核中的各种数据结构 exit函数在_exit的基础上进行了包装,加了好几道工序。 差别 exit函数在调用之前要检查文件的打开情况,在这个过 继续阅读 >>


陈新 18/08/05 12:10:09
概念 鉴于普通二叉树使用过程中会出现空间的浪费,后人对在在二叉树的的基础上做了改进,利用它的空指针域存放在某种遍历次序下指向它的前驱结点,和后继结点的指针。这些指针称为线索,相应的二叉树就成了线索二叉树。 结点结构 Ltag为0时指向该结点的左孩子,为1时指向该结点的前驱。 Rtag为0时指向该结点的右孩子,为1时指向该结点的后继。 结构实现 线索存储结构定义 typedef enum {Link,Thread} PointerTag; //定义线索 typedef struct BithrNode{ char data; //结点数据 struct BithrNode *pLchild; struct BithrNode *pRchild; //左右孩子 PointerTag Ltag; PointerTag Rtag; 继续阅读 >>


陈新 18/08/03 01:22:25
VMware网络配置方式 桥接模式 桥接模式下虚拟机会使用本机的实际网卡,所以会得到该网段一个实际的IP。此时它相当于一个独立的主机,它可以访问到局域网内的任何物理机机。优点:可以与局域网内的任何主机进行通讯。 由于主机网卡的不一而同,通常桥接模式下有两种连接到网卡的方式 1.无线连接。 2.有线连接。 更改方式在虚拟网络配置里面。 A A1 A2 B之间可以相互通讯 NAT模式 NAT模式下可以实现在虚拟系统里直接通过本机的网络来访问互联网,它的TCP/IP配置是由VMnet8虚拟网络的DHCP服务器提供的,在外部网络和虚拟网络之间,它相当于一个交换机,所以NAT模式下只允许与本机进行通讯,它的优点就是网络配置方式简单,只需要你的物理机可以访问互联网即可,所以个人使用的话,如果怕麻烦,可以选择这种连接方式。使用这种模式,虚拟机可以单向访问到网络上的其他主机,其他主机不能访问该虚拟机 A1 A2 可以访问B B不能访问 A1 A2 A A1 A2 之间可以进行任 继续阅读 >>


陈新 18/07/29 12:38:24
系统编程_1 刚接触linux下的C语言编程,试着写了常见命令ls的相关参数,其中自己感觉-R选项的实现还是比较麻烦,走了不少弯路。血与泪的创作开始了(滑稽)。 int Recursive(char *path) { DIR * dir; struct stat buf; struct dirent *ptr; int i = 0,count = 0,k = 0,m; char st[20000]; char * p; char name[20000]; //当你想统计'/'目录下的文件的时候,大数组完全就是种享受(滑稽) p = path + strlen(path); if(lstat(path,&buf) < 0) //获取目录属性 { perror("lstat"); return -1; 继续阅读 >>


陈新 18/07/27 19:53:54
#include <stdio.h> #include<stdlib.h> #include<string.h> #include<conio.h> typedef struct List{ char name[8]; int number; char sex[2]; struct List*pNext; }NODE,*PNODE; void menu(void); PNODE insert_student(); /*添加学生信息*/ void search_student(PNODE pH); /*查询学生信息*/ void delate_student(PNODE pHead); /*删除学生信息*/ void print_student_additon_order(PNODE); /*以添加顺序输出学生信息*/ void print_s 继续阅读 >>


陈新 18/05/26 16:49:31
排序 ## Bubble_sort ## void bublesort(int *a,int n) { int i,j,t; for(i = 0;i<n-1;i++) { for(j = i+1;j<n;j++) { if(a[i]>a[j]) { t = a[i]; a[i] = a[j]; a[j] = t; } } } return; } ## Select_sort ## void selectsort(int *a,int n) { int i,j,k,t; for(i = 0;i<n - 1;i++) { k = i; for(j = i+1;j<n;j++) { 继续阅读 >>


陈新 18/05/26 14:40:28
规则: 判断树是否为空,为空则返回; 若不空,从树的第一层。也就是根节点开始访问。 从上而下逐层遍历, 在同一层中,按从左到右的顺序对节点逐个访问。 #include<stdio.h> #include<stdlib.h> typedef struct tree{ char date; struct tree*pLeft,*pRight; }TREE,*PTREE; typedef struct List{ PTREE pBit; struct List *pNext; }NODE,*PNODE; typedef struct queue{ PNODE front; PNODE rear; }QUEUE,*PQUEUE; void init_queue(PQUEUE); /*初始化队列*/ void en_queue(PQUEUE,PTREE); /*入队操作*/ PTRE 继续阅读 >>


陈新 18/05/26 12:35:32
1