欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 汽车 > 时评 > 20250319 C语言 Struct结构体字节对齐

20250319 C语言 Struct结构体字节对齐

2025/3/20 9:38:33 来源:https://blog.csdn.net/qq_44148259/article/details/146233484  浏览:    关键词:20250319 C语言 Struct结构体字节对齐

一 C语言Struct结构体对齐的基本原则

1 首个成员的起始地址偏移为0,且为低地址
2 其它成员的首地址必须与其 自身大小size 或 #pragram pack (n),中较小的数对齐
3 结构体的总大小 一定是其 最大的成员变量大小s 的整数倍

struct test
{char a;  //1short b;  //2char c;  //1
};

图上test结构体的大小为6字节。

#pragma pack(1)
struct test{char a;short b;char c;
};
该结构体的大小为4字节。

图上pragma强制结构体按照1字节对齐,因此该结构体的大小为4字节。

#pragma pack(1)
struct test{char a;int b;char c;
};
该结构体的大小为6字节

在使用了 #pragma pack(1) 强制 ‌1字节对齐‌ 的情况下,结构体 test 的成员会紧密排列,‌不插入任何填充字节‌,因此其总大小为 ‌6字节‌,而非默认对齐规则下的倍数。

#pragma pack(n) 会强制指定对齐值为 n 字节,覆盖默认规则。
结构体大小无需是最大成员的倍数‌,因为对齐已被强制约束为 n 字节。
在需要节省内存或与硬件交互时,常用此指令消除填充,但会牺牲访问速度。

#pragma pack(8)
struct test{char a;    // 1int b;     // 4short c;  // c
};
该结构体的大小为12字节

虽然pragma宏将对齐指定为8字节,但结构体test中最大的成员大小为4字节。编译器计算结构体的大小时,会按照 【最大成员变量大小】和【pragma指定宏】的最小值来对齐。

二 位域

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词