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

时间:2011-08-04 20:41:58

标签: c++ visual-studio multithreading memory-alignment

我们有一些遗留代码,其中的类具有在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的一些文档,但我很难找到解释默认值的文档。

3 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:0)

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

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

  

打开项目的“属性页”对话框。有关详细信息,请参见如何:打开项目>物业页面。

     

单击 C / C ++ 文件夹。

     

点击代码生成属性页。

     

修改结构成员对齐属性。

答案 2 :(得分:0)

您可以按照http://msdn.microsoft.com/en-us/library/83ythb65.aspx使用__declspec(align())。您可以将其与结构的各个成员一起使用。请参阅上面链接中的最后一个示例。