【C/C++】结构体内存对齐

结构体内存对齐详解

1、第一个成员在与结构体变量偏移量为0的地址处
2、其他成员变量要偏移到 对齐数 的整数倍的地址处 ,注意 偏移是从结构体首地址处开始的。

    对齐数 取的是 编译器默认的一个对齐数 该成员大小 这个俩个数中的最小值。

   【VS中默认的值为8、Linux环境默认不设对齐数(对齐数是结构体成员自身的大小)】
3、结构体总大小  为最大对齐数(每个成员变量都有一个对齐数)的整数倍
4、如果嵌套了结构体的情况,嵌套的结构体对齐到自己的最大对齐数的整数倍处,结构体的整体大小就是所有最大对齐数(含嵌套结构体的对齐数)的整数倍

 为什么要进行内存对齐? 

1、是平台本身的原因,任意地址上的任意数据是不能随意访问的,如果不正确访问可能会造成硬件异常。

2、是性能原因,为了访问未对齐的内存,处理器需要作两次内存访问;而对齐的内存访问仅需要一次访问 

 详情见 https://baijiahao.baidu.com/s?id=1642400273667910278&wfr=spider&for=pc

如何让结构体按照指定的对齐参数进行对齐?

  需要使用一个预处理指令#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

 

posted @ 2024-07-15 17:33  joker_2255  阅读(118)  评论(0)    收藏  举报