结构成员和静态变量的对齐
Alignment of structure members and static variables
我们有一些遗留代码,类的成员在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())。您可以对结构体的单个成员使用此方法。参见上面链接中的最后一个例子。
相关文章:
- 如何理解将半精度指针转换为无符号长指针和相关的内存对齐
- 如何创建一个QTableWidgetItem,用长文本右对齐,左边有省略号
- 如何在信号处理程序和普通函数中对全局变量进行互斥读写操作
- 我可以检测和更改 gcc/g++ 中结构的当前数据对齐设置吗?
- 64位机器上的C++内存对齐
- 为什么我可以将变量存储在不是其最小对齐方式的倍数的地址?
- 是否值得对齐变量?
- C++11:16 字节原子<>变量是否在 16 字节边界上自动对齐,从而允许CMPXCHG16B指令?
- C++无法将对齐的字符串存储在字符串变量中并打印出来
- 指代结构与变量时对齐
- 是否存在32位变量无法正确对齐的情况
- 对齐的成员变量和动态分配
- 堆分配变量的结构成员对齐
- 查询特定变量的对齐方式
- 原子变量的对齐
- 为什么128位变量应该对齐到16字节边界
- 在c++中对齐(格式化)输出//多个变量在一行中
- C++变量地址和对齐方式 |x86
- 结构成员和静态变量的对齐
- c++ 11变量参数对齐