结构体内存对齐详解
1、第一个成员在与结构体变量偏移量为0的地址处
2、其他成员变量要偏移到 对齐数 的整数倍的地址处 ,注意 偏移是从结构体首地址处开始的。
对齐数 取的是 编译器默认的一个对齐数 与 该成员大小 这个俩个数中的最小值。
【VS中默认的值为8、Linux环境默认不设对齐数(对齐数是结构体成员自身的大小)】
3、结构体总大小 为最大对齐数(每个成员变量都有一个对齐数)的整数倍
4、如果嵌套了结构体的情况,嵌套的结构体对齐到自己的最大对齐数的整数倍处,结构体的整体大小就是所有最大对齐数(含嵌套结构体的对齐数)的整数倍
为什么要进行内存对齐?
1、是平台本身的原因,任意地址上的任意数据是不能随意访问的,如果不正确访问可能会造成硬件异常。
2、是性能原因,为了访问未对齐的内存,处理器需要作两次内存访问;而对齐的内存访问仅需要一次访问
如何让结构体按照指定的对齐参数进行对齐?
需要使用一个预处理指令#pragma pack
具体用例
1 #pragma pack(1)//设置默认对齐数为1 2 struct S1 3 { 4 char c1; 5 int i; 6 char c2; 7 }; 8 #pragma pack()//取消设置的默认对齐数,还原为默认View Code
标签:整数倍,内存,默认,访问,C++,对齐,体内,结构 From: https://www.cnblogs.com/JOKER2255/p/18303632