我们有一些遗留代码,其中的类具有在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的一些文档,但我很难找到解释默认值的文档。
答案 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())。您可以将其与结构的各个成员一起使用。请参阅上面链接中的最后一个示例。