【发布时间】:2014-12-24 21:18:57
【问题描述】:
我有一个结构,其中包含不同长度类型的数据成员(一些整数,一些单词,一些只是单个字节)。结构被打包(使用#pragma pack(1))。
我的问题是:是否可以让结构的数据成员内存地址之一在内存中对齐(例如,地址是否可以被 16 整除)?
我知道可以使用 attribute 对齐整个结构(或者换句话说,它的第一个成员)。我想知道是否可以对齐特定成员而不仅仅是第一个。
基本上我需要打包结构(每个成员都跟在前一个成员之后,没有填充),我需要其中一个成员的地址,而不是第一个,可以被 16 整除。
【问题讨论】:
-
如果类型的大小不是 16 的倍数,这将永远不会适用于数组。
-
可能,通过对齐整个结构,然后,用计算器,添加正确数量的填充字节......如果你不能在结构中填充,你可以将它包含在另一个结构并在那里添加填充。此外,您可以将成员移动到开头并对齐结构。
-
对齐的成员可能会引入填充。
-
@Jarod42:“最整洁”的变体是让对齐的成员位于精确的地址,并且整个(未对齐的)结构相应地移动。比如说,您想要对齐由两个字节组成的结构的第二个字节。该结构将从 align+15 地址开始。
-
@Omer:出于好奇,你需要这个做什么?