在指令 #pragma pack(n) 中,哪些值是 n 的有效值?
In the directive, #pragma pack(n), which values are valid values of n?
我做了 google,发现 n= 1,2,4,8 只是预处理器指令的有效参数 #pragma pack(n)
。
谁能告诉我上述值以外的值有什么问题吗?
(ex- n=3,5, etc 为什么无效)?
是否只有上述数值可以作为参数?
如何取 n 的值以及为什么?
我正在使用 GCC 编译器。
以下是对齐必须是 2 的小幂的三个原因。
GCC documentation是这么说的:pack值是“总是要求是2的小幂。”
C 2018 6.2.5 4 says alignment must be a power of two: “Every valid alignment value shall be a nonnegative integral power of 2。”关于最大对齐的条款中有额外的文本(因此将其限制为 2 的小幂),但它是灵活的。
内存使用二进制寻址和组织。从内存中获取数据使用地址位来激活内存设备中的部分,并使用字或其他字节组中的 select 字节。所以分组之间的对齐边界位于低位变化的地方。这意味着新组的第一个字节的低 n 地址位为零,因此地址是 2n[=28 的倍数=].
我做了 google,发现 n= 1,2,4,8 只是预处理器指令的有效参数 #pragma pack(n)
。
谁能告诉我上述值以外的值有什么问题吗? (ex- n=3,5, etc 为什么无效)?
是否只有上述数值可以作为参数?
如何取 n 的值以及为什么?
我正在使用 GCC 编译器。
以下是对齐必须是 2 的小幂的三个原因。
GCC documentation是这么说的:pack值是“总是要求是2的小幂。”
C 2018 6.2.5 4 says alignment must be a power of two: “Every valid alignment value shall be a nonnegative integral power of 2。”关于最大对齐的条款中有额外的文本(因此将其限制为 2 的小幂),但它是灵活的。
内存使用二进制寻址和组织。从内存中获取数据使用地址位来激活内存设备中的部分,并使用字或其他字节组中的 select 字节。所以分组之间的对齐边界位于低位变化的地方。这意味着新组的第一个字节的低 n 地址位为零,因此地址是 2n[=28 的倍数=].