【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 @   joker_2255  阅读(48)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!
点击右上角即可分享
微信分享提示