假设我们有一些结构
struct S
{
double a, b;
~S(); // S doesn't have to be POD
};
此类结构的对齐方式通常应为8,因为其最大包含类型的大小为8。
现在,假设我们要声明一个占位符结构来保存
S
的值:struct Placeholder
{
char bytes[ sizeof( S ) ];
};
现在,我们要将其放置在另一个类中:
class User
{
char someChar;
Placeholder holder;
public:
// Don't mind that this is hacky -- this just shows a possible use but
// that's not the point of the question
User() { new ( holder.bytes ) S; }
~User() { ( ( S * )( holder.bytes ) )->~S(); }
};
问题是,
Placeholder
现在在User
中未正确对齐。由于编译器知道Placeholder
由字符组成,而不是由double组成,因此通常会使用1的对齐方式。有没有一种方法可以声明
Placeholder
,其对齐方式与C++ 03中的S
对齐?请注意,S
不是POD类型。我也了解C++ 11具有alignas
,但是尚不通用,所以我宁愿不要指望它。更新:只是为了澄清,这适用于任何
S
-我们不知道它包含什么。 最佳答案
我相信boost::aligned_storage
可能正是您想要的。它以这种方式使用联合技巧,使您的类型无关紧要(只需使用sizeof(YourType)
告诉它如何对齐)即可确保对齐正确进行。
关于c++ - 对应该在C++中保存结构的缓冲区使用正确的对齐方式,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/17859273/