いくつかの構造体があるとします。
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 ではなく char で構成されていることを認識しているため、通常は 1 のアラインメントを使用します。
C++03Placeholder
のアラインメントと一致するアラインメントで宣言する方法はありますか? PODタイプS
ではありませんのでご注意ください。S
C++11 には があることも理解してalignas
いますが、これはまだ普遍的に利用できるわけではないので、可能であれば当てにしないでください。
更新: 明確にするために、これはS
どのようなものでも機能するはずです。内容はわかりません。