1.空类、构造函数、成员函数都是不占用空间的,都是一个size为1,作为类的占位符,如何区分类
2.如果一个类含有虚函数,那么他的size将会是8(x64位)
2.1 virtual大小是否与系统平台相关?x64和x86
2.2 vptr和vtable的原理和数据结构如何?
3.构造函数的顺序
>>先基类的构造再子类(B -> SubB)
4.析构函数的顺序
>>先子类再基类
5.析构函数为何必须为虚函数?
6.哪些函数可以被声明为虚函数?
inline static 成员 构造 拷贝
7.内存泄露时如何定位和排查?
8.进程优先级设计?
9.线程优先级设计?
10.进程和线程的选择原则是何种?
11.stl的堆排序
12.stl的swap意义
13.stl的bind的应用
14.stl实现偏特性
15.gcc/g++的编译连接的参数,连接顺序
{
-Wl,static
-Wl,dynamic
-Wl,El
-Wl,xx
以上每个特性到底是干什么用的
}
16.C++的多态性是依据于虚函数进行实现的
17.C++的继承是依赖于什么实现的?
18.计算对象的sizeof()
>>class B{一个虚函数、一个Int},结果sizeof为16,说明x64的地址分布为8字节
>>虚函数为8,下面int为4,结果对齐之后为16字节
>>struct {char b;}//大小仍旧只有1个字节,不会去字节对齐
>>x64上(int-4,long-8,vtable-8,指针的size为8)
>>最大的带宽按照指定的最大的瓶颈进行计算
19.#pragma pack()取消对齐
#pragma pack(n)设置对齐字节,一般而言是要求为2的指数(否则失效)
>>#pragma pack(1)表示紧凑型的数据结构的设计,可以只针对某些数据结构进行设计,
采用以上宏进行括号指定即可
>>请记住一点,当pack的值比现有的int a,char b等要大,此时只按照现有内存结构来判定而已而非pack的最大值
>>pack只是限定一个对齐的尺度,如果基本尺度都没有超过的时候那么问题就来啦
20.printf()操作时,后者值比格式化的要多的时候,不会报错,只会一一对应而已
21.typedef 定义的指针只是说明指针的偏移尺度而已,只要不去指定没有多大的问题
22.格式化的要点
>>%X 16进制
>>地址的偏移尺度是根据指向的数据而来的,如果是char则为1,否则为int(4),struct也是如此
23.B buf[3];//则需要执行3次析构函数
24.多态技术(泛型技术-模板、RTTI、虚函数技术)
25.虚函数表的原理
>>基类和子类都拥有虚函数表指针(准确的说是指针)
>>虚函数通过VTable进行实现,存储的是一个类的虚函数的地址表
这张表解决了继承、覆盖、
26.
class Base{
public:
Base(){}
virtual void funA(){ cout << "funA"<< endl; }
virtual void funB(){ cout << "funB"<< endl; }
};
Base b;//类实例的首个地址
虚函数首地址:&b
首个虚函数地址:printf("first:%X\n",(int*)*(int*)(&b));
调度地址:Fun pF =(Fun)*(int*)*(int*)(&b);
(Fun)*((int*)*(int*)(&b)+1);//第二个虚函数
(Fun)*((int*)*(int*)(&b)+2); //第三个虚函数
27.C++的类的内存结构分布图
>>采用VS调试查看一个类实例的内存结构分布图
28.C++对象的内存布局
Person p1;//一个int id,age;一个成员函数
int *p = (int*)&p1;
*p => person.id
++p;
*p => person.age
①非静态成员变量存放于对象之类,存放顺序与定义的顺序一致
②成员函数时存放于实例对象之外,sizeof()可以知晓
③静态变量存放于类的对象之外,staitc函数也存放于类的对象之外
Person::sCount 和 Person::personCount()
④虚函数virtual则{vptr,id,age成员变量}
vptr -> a | b | c
id
age
⑤单个类继承模型:vptr,Base类非static成员,子类中非static成员
⑥多继承:Base1的vptr,Base1的成员,Base2的vptr,Base2的成员,子类的成员
类为每个虚函数产生一个指针,存放于vtable之中
每个类对象会被安插一个vptr指针,指向该类的虚函数表,所以需要考虑到他的内存模型
其中类的vptr指针的设置、复位都是被构造/析构/赋值等操作符进行运行时切换
29.编译的流程和模型
30.C++的内存模型
31.C的内存模型
32.tcp的包的模型
33.usb的包的模型
34.http的包的模型
35.rtsp的包的模型
36.udp的包的模型
37.libevent/ace等网络模型
38.ppp的包模型
39.进程的内存模型
40.线程的内存模型
41.内核态与用户态的切换与工作模型
http://blog.csdn.net/ljianhui/article/details/46408645
2.如果一个类含有虚函数,那么他的size将会是8(x64位)
2.1 virtual大小是否与系统平台相关?x64和x86
2.2 vptr和vtable的原理和数据结构如何?
3.构造函数的顺序
>>先基类的构造再子类(B -> SubB)
4.析构函数的顺序
>>先子类再基类
5.析构函数为何必须为虚函数?
6.哪些函数可以被声明为虚函数?
inline static 成员 构造 拷贝
7.内存泄露时如何定位和排查?
8.进程优先级设计?
9.线程优先级设计?
10.进程和线程的选择原则是何种?
11.stl的堆排序
12.stl的swap意义
13.stl的bind的应用
14.stl实现偏特性
15.gcc/g++的编译连接的参数,连接顺序
{
-Wl,static
-Wl,dynamic
-Wl,El
-Wl,xx
以上每个特性到底是干什么用的
}
16.C++的多态性是依据于虚函数进行实现的
17.C++的继承是依赖于什么实现的?
18.计算对象的sizeof()
>>class B{一个虚函数、一个Int},结果sizeof为16,说明x64的地址分布为8字节
>>虚函数为8,下面int为4,结果对齐之后为16字节
>>struct {char b;}//大小仍旧只有1个字节,不会去字节对齐
>>x64上(int-4,long-8,vtable-8,指针的size为8)
>>最大的带宽按照指定的最大的瓶颈进行计算
19.#pragma pack()取消对齐
#pragma pack(n)设置对齐字节,一般而言是要求为2的指数(否则失效)
>>#pragma pack(1)表示紧凑型的数据结构的设计,可以只针对某些数据结构进行设计,
采用以上宏进行括号指定即可
>>请记住一点,当pack的值比现有的int a,char b等要大,此时只按照现有内存结构来判定而已而非pack的最大值
>>pack只是限定一个对齐的尺度,如果基本尺度都没有超过的时候那么问题就来啦
20.printf()操作时,后者值比格式化的要多的时候,不会报错,只会一一对应而已
21.typedef 定义的指针只是说明指针的偏移尺度而已,只要不去指定没有多大的问题
22.格式化的要点
>>%X 16进制
>>地址的偏移尺度是根据指向的数据而来的,如果是char则为1,否则为int(4),struct也是如此
23.B buf[3];//则需要执行3次析构函数
24.多态技术(泛型技术-模板、RTTI、虚函数技术)
25.虚函数表的原理
>>基类和子类都拥有虚函数表指针(准确的说是指针)
>>虚函数通过VTable进行实现,存储的是一个类的虚函数的地址表
这张表解决了继承、覆盖、
26.
class Base{
public:
Base(){}
virtual void funA(){ cout << "funA"<< endl; }
virtual void funB(){ cout << "funB"<< endl; }
};
Base b;//类实例的首个地址
虚函数首地址:&b
首个虚函数地址:printf("first:%X\n",(int*)*(int*)(&b));
调度地址:Fun pF =(Fun)*(int*)*(int*)(&b);
(Fun)*((int*)*(int*)(&b)+1);//第二个虚函数
(Fun)*((int*)*(int*)(&b)+2); //第三个虚函数
27.C++的类的内存结构分布图
>>采用VS调试查看一个类实例的内存结构分布图
28.C++对象的内存布局
Person p1;//一个int id,age;一个成员函数
int *p = (int*)&p1;
*p => person.id
++p;
*p => person.age
①非静态成员变量存放于对象之类,存放顺序与定义的顺序一致
②成员函数时存放于实例对象之外,sizeof()可以知晓
③静态变量存放于类的对象之外,staitc函数也存放于类的对象之外
Person::sCount 和 Person::personCount()
④虚函数virtual则{vptr,id,age成员变量}
vptr -> a | b | c
id
age
⑤单个类继承模型:vptr,Base类非static成员,子类中非static成员
⑥多继承:Base1的vptr,Base1的成员,Base2的vptr,Base2的成员,子类的成员
类为每个虚函数产生一个指针,存放于vtable之中
每个类对象会被安插一个vptr指针,指向该类的虚函数表,所以需要考虑到他的内存模型
其中类的vptr指针的设置、复位都是被构造/析构/赋值等操作符进行运行时切换
29.编译的流程和模型
30.C++的内存模型
31.C的内存模型
32.tcp的包的模型
33.usb的包的模型
34.http的包的模型
35.rtsp的包的模型
36.udp的包的模型
37.libevent/ace等网络模型
38.ppp的包模型
39.进程的内存模型
40.线程的内存模型
41.内核态与用户态的切换与工作模型
http://blog.csdn.net/ljianhui/article/details/46408645