1

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

4

3 回答 3

0

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

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

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

单击C/C++文件夹。

单击代码生成属性页。

修改结构成员对齐属性。

于 2011-08-04T21:00:00.330 回答
0

You can specify the packing for an entire structure by using the #pragma pack directive.

#pragma pack(4)
struct MyStruct 
{
  ...
};
#pragma pack()  // this reset the packing to default
于 2011-08-04T20:47:43.780 回答
0

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

于 2011-08-05T01:07:55.220 回答