结构成员和静态变量的对齐

Alignment of structure members and static variables

本文关键字:对齐 变量 静态 成员 结构      更新时间:2023-10-16

我们有一些遗留代码,类的成员在Interlocked*函数调用中使用。

我想确保我的一些成员变量在4字节边界上对齐(用于InterlockedIncrement,参见http://blogs.msdn.com/b/oldnewthing/archive/2004/08/30/222631.aspx)。

我找不到任何明确规定VS 2010结构成员默认对齐方式的内容。实验上,我还没有能够使结构违反4字节对齐而不改变默认的包装。我所能发现的是,默认的包装是8字节,我们在任何地方都使用它。

http://blogs.msdn.com/b/oldnewthing/archive/2004/08/30/222631.aspx

我想知道的是我们是否需要添加__declspec(align(4))到Interlocked*调用中使用的每个变量?

编辑:我知道包装和怎么包装。抱歉我说得不够具体。CRT还会分配我所有的结构体吗?这样,给定默认的8字节包装,我所有的结构体成员将默认在4字节边界上对齐?

32位int静态变量是否默认对齐?我正在寻找一些关于VS的文档,但是我很难找到文档来解释默认值。

您可以使用#pragma pack指令指定整个结构的包装。

#pragma pack(4)
struct MyStruct 
{
  ...
};
#pragma pack()  // this reset the packing to default

您可以在项目设置中直接更改结构成员对齐方式。这个选项被称为"结构成员对齐"。您只需将其设置为4个字节。

http://msdn.microsoft.com/en-us/library/xh3e3fd0.aspx

打开项目的Property Pages对话框。有关详细信息,请参见如何:打开项目>属性页。

点击C/c++ 文件夹

单击代码生成属性页。

修改Struct Member Alignment属性。

您可以按照http://msdn.microsoft.com/en-us/library/83ythb65.aspx使用__declspec(align())。您可以对结构体的单个成员使用此方法。参见上面链接中的最后一个例子。