从新发现这个问题是由于在体系结构课上提到的一个概念,alignment对齐的概念。c++
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补足。this
此外,普通成员函数不会占用对象空间的大小,也不会影响sizeof的结果。指针
而若是是虚函数就会占用空间了。code
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++对象模型》
内存分配有三种方式: