
🎬 HoRain 云小助手:个人主页
⛺️生活的理想,就是为了理想的生活!
⛳️ 推荐
前些天发现了一个超棒的服务器购买网站,性价比超高,大内存超划算!忍不住分享一下给大家。点击跳转到网站。
目录

内存对齐规则
-
成员对齐
每个成员的地址必须是其类型大小的整数倍(或更小值,若指定了#pragma pack)。 -
结构体总大小
必须是所有成员中最大对齐值的整数倍,不够时自动填充字节。 -
嵌套结构体
嵌套结构体的对齐值取其内部最大成员的对齐值。
示例分析
struct Example {
char a; // 1字节
// 填充3字节(假设int对齐为4)
int b; // 4字节
double c; // 8字节
};
// 总大小:1 + 3(填充) + 4 + 8 = 16字节
控制对齐的方式
-
编译器指令
使用#pragma pack(n)指定对齐值:#pragma pack(1) // 1字节对齐 struct TightPacked { char a; int b; // 不再填充 double c; }; // 总大小:1 + 4 + 8 = 13字节 #pragma pack() // 恢复默认对齐 -
C11标准关键字
_Alignas指定对齐值:struct AlignedStruct { _Alignas(16) int a; // 按16字节对齐 char b; };_Alignof获取对齐值:printf("%zu", _Alignof(int)); // 输出4(在32位系统)
优化建议
- 调整成员顺序
将大类型放在前面可减少填充。例如:struct Optimized { double a; // 8字节 int b; // 4字节 char c; // 1字节 // 填充3字节(总大小:8 + 4 + 1 + 3 = 16) }; // 如果顺序为 int -> double -> char,总大小会更大(需更多填充)
总结
- 对齐规则由数据类型和编译器共同决定。
- 合理调整成员顺序可优化内存占用。
- 特殊场景(如网络数据传输)可使用
#pragma pack(1)禁用填充。
❤️❤️❤️本人水平有限,如有纰漏,欢迎各位大佬评论批评指正!😄😄😄
💘💘💘如果觉得这篇文对你有帮助的话,也请给个点赞、收藏下吧,非常感谢!👍 👍 👍
🔥🔥🔥Stay Hungry Stay Foolish 道阻且长,行则将至,让我们一起加油吧!🌙🌙🌙


350

被折叠的 条评论
为什么被折叠?



