个人网站怎么做游戏,嘉兴网站设计公司,从事广告设计需要学什么,seo是什么意思为什么要做seo我们经常看到求 sizeof(A) 的值的问题#xff0c;其中A是一个结构体#xff0c;类#xff0c;或者联合体。 为了优化CPU访问和优化内存#xff0c;减少内存碎片#xff0c;编译器对内存对齐制定了一些规则。但是#xff0c;不同的编译器可能有不同的实现#xff0c;本文…我们经常看到求 sizeof(A) 的值的问题其中A是一个结构体类或者联合体。 为了优化CPU访问和优化内存减少内存碎片编译器对内存对齐制定了一些规则。但是不同的编译器可能有不同的实现本文只针对VC编译器这里使用的IDE是VS2012。 #pragma pack()是一个预处理表示内存对齐。布局控制#pragma为编译程序提供非常规的控制流信息。 /**********结构体的大小的规则*************/ 结构体大小是处理器位数和结构体内最长数据元素所占字节数二者中较小的那一个的整数倍。 比如说假设处理器位数为n结构体内最大数据元素所占字节数为m。 处理器为32位n 4;结构体内最大数据类型为shortm 2; n m;结构体大小为m的整数倍反之亦然。 注意有些虽然是64位的操作系统但是编译器却是32位的此时位数为32. 1 class A{
2 int a;
3 char b;
4 short c;
5 }; sizeof(A)为8为4的整数倍。 1 struct B{
2 short a;
3 short b;
4 short c;
5 }; sizeof(B)为6为2sizeof(short)的整数倍。 注意C中的结构体与类只有一个区别就是结构体成员默认是public而类默认是private。 class X{
public:double a;float b;int c;char d;
}; sizeof(X)为20为4处理器位数的整数倍。 /********* #pragma pack(n) *************/ #pragma pack(n)中的n默认是4即处理器位数32但我们可以自己定义它的大小。 #pragma pack(1)
class A{
public:int a;char b;short c;
}; 此时sizeof(A)为7为1(#pragma pack(1))的整数倍。 #pragma pack(1)class X{public:double a;int b;short c;char d;}; sizeof(X)为15为1#pragma pack(1)的整数倍。 #pragma pack(4)class X{public:double a;int b;short c;char d;}; sizeof(X)为16为4#pragma pack(4)的整数倍。 #pragma pack(8)class X{public:double a;int b;short c;char d;}; sizeof(X)为16为8#pragma pack(8) 或者 sizeof(double)的整数倍。 /***************内存对齐**************/ 结构体中数据元素所在内存地址由两个因素决定。 一是#pragma pack(n) 中的n二是元素类型所占字节数sizeof(type)两者中取较小的一个元素内存地址到结构体或类的起始地址的偏移量为较小数的整数倍。 比如#pragma pack(n)默认为4有以下结构体 struct A{int a;char b;short c;
}; a的起始地址距离结构体起始地址的偏移量为0是sizeof(int)的整数倍。 b的起始地址距离结构体起始地址的偏移量为4是sizeof(char)的整数倍。 c的起始地址距离结构体起始地址的偏移量为5不是sizeof(short)的整数倍所以它的起始地址偏移量将会是6而不是5。 输出a, b, c 的地址为 0043FD68 0043FD6C 0043FD6E 可以看到c的起始地址比b的起始地址大了2个字节b占了2个字节的大小这是因为c的类型是short型大小为2而n默认是4sizeof(short) n所以偏移量应该是2的整数倍这里是6. 转载于:https://www.cnblogs.com/piginthetree/p/3894136.html