隋凤富近况,娱乐名人榜,从此以后txt
重新发现这个问题是因为在体系结构课上提到的一个概念,alignment对齐的概念。
class myclass { public : char c; // 1 byte int i; // 4 byte };
像上面这个c++的类,它有两个变量。
myclass myclass; cout << sizeof(myclass) << endl;
或者直接算它的大小
cout << sizeof(myclass) << endl;
然后按照道理,myclass的大小,应该是5 byte才对,可是最后输出的结果是8,显然这就说明系统在创建对象的时候,将对象的变量进行了对齐操作,不足4 byte的按照4 byte补足。
此外,普通成员函数不会占用对象空间的大小,也不会影响sizeof的结果。
而如果是虚函数就会占用空间了。
class myclass { public : char c; // 1 byte int i; // 4 byte void func(); virtual void func2() //4 byte {} };
结果是占用12 byte的大小。
这种的差别是由于c++的类所有的虚函数都是由一个虚函数指针所管理,它的虚函数被放在别的内存空间中管理。而普通函数是由this指针所管理,this指针并不是对象本身的一部分,所以不会影响到sizeof的结果。
class myclass { public : char c; // 1 byte long long t; };
long long为8 byte,所以总共占用16 byte。
在分析完各种情况之后,只有第一个的结果显得特别诡异,为什么空类的大小不是0,而是1?
每个类的实例,在内存中都有一个独一无二的地址,为了达到这个目的,编译器往往会给一个空类隐含的加一个字节,这样空类在实例化后在内存得到了独一无二的地址。------《深度探索c++对象模型》
内存分配有三种方式:
如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复
如何在没有core文件的情况下用dmesg+addr2line定位段错误
用QT制作3D点云显示器——QtDataVisualization
网友评论