我做了谷歌,发现 n= 1,2,4,8 只是预处理器指令的有效参数#pragma pack(n)
。
有人可以告诉我上述值以外的值有什么问题吗?(例如 n=3,5 等为什么无效)?
上述值是唯一可以作为参数的值吗?
如何取 n 的值,为什么?
我正在使用 GCC 编译器。
我做了谷歌,发现 n= 1,2,4,8 只是预处理器指令的有效参数#pragma pack(n)
。
有人可以告诉我上述值以外的值有什么问题吗?(例如 n=3,5 等为什么无效)?
上述值是唯一可以作为参数的值吗?
如何取 n 的值,为什么?
我正在使用 GCC 编译器。
以下是对齐必须是 2 的小幂的三个原因。
GCC 文档是这样说的:pack 值“总是要求是 2 的小幂”。</p>
C 2018 6.2.5 4 说对齐必须是 2 的幂:“每个有效的对齐值都应该是 2 的非负整数幂。” 条款中有关于最大对齐的附加文本(因此将其限制为 2 的小幂),但它是灵活的。
内存使用二进制寻址和组织。从内存中获取数据使用地址位来激活内存设备中的部分并选择字或其他字节组中的字节。所以分组之间的对齐边界位于低位变化的地方。这意味着新组的第一个字节的低n地址位为零,因此地址是 2 n的倍数。