假设我们有一些结构,比如说
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
是由字符组成的,而不是双精度数,它通常会使用 1 的对齐方式。
有没有办法声明Placeholder
与S
C++03 中的对齐匹配?请注意,S
它不是 POD 类型。我也知道 C++11 有alignas
,但这还不是普遍可用的,所以如果可能的话,我宁愿不要指望它。
更新:澄清一下,这应该适用于任何人S
——我们不知道它包含什么。