#include <iostream> using namespace std; #pragma pack(2) class A { int i; union U { char buff[13]; int i; }u; void foo() { } typedef char* (*f)(void*); enum{red, green, blue} color; }a; int main(void) { cout << sizeof(a)<< endl; return 0; }
运行结果:
看到这个结果是22,不是24是不是感觉很惊讶。我们除了共用体U外全部屏蔽,再次执行看看执行结果是多少?
#include <iostream> using namespace std; #pragma pack(2) class A { // int i; union U { char buff[13]; int i; }u; void foo() { } typedef char* (*f)(void*); // enum{red, green, blue} color; }a; int main(void) { cout << sizeof(a)<< endl; return 0; }
执行结果:
看到这里,你也许就知道了第一次执行的结果为什么不是24,而是22,因为这里有句#pragma pack(2) 就是这句,使得内存是按照2字节对齐的关系,而不是默认的4字节对齐。如果把这句#pragma pack(2)去掉,再次执行,结果为16,这里就不贴图片了。
那么空类,或者没有变量的对象的大小为多少呢?
#include <iostream> using namespace std; #pragma pack(2) class A { // int i; // union U // { // char buff[13]; // int i; // }u; void foo() { } typedef char* (*f)(void*); // enum{red, green, blue} color; }a; int main(void) { cout << sizeof(a)<< endl; return 0; }
执行结果:
对,没错,空类,或者没有变量只有函数声明的类对象所占的大小为1.
如果去掉#pragma pack(2),执行结果是多少呢?
#include <iostream> using namespace std; class A { int i; union U { char buff[13]; int i; }u; void foo() { } typedef char* (*f)(void*); enum{red, green, blue} color; }a; int main(void) { cout << sizeof(a)<< endl; return 0; }
![](file:///C:UsersAdministratorAppDataRoamingTencentUsers103862095QQWinTempRichOle9BZ8]T[K0A)@K}@Y]3N2J_7.jpg)