1

いくつかの構造体があるとします。

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ではありませんのでご注意ください。SC++11 には があることも理解してalignasいますが、これはまだ普遍的に利用できるわけではないので、可能であれば当てにしないでください。

更新: 明確にするために、これはSどのようなものでも機能するはずです。内容はわかりません。

4

2 に答える 2

1

boost::aligned_storage私はそれがまさにあなたが探しているものかもしれないと信じています。sizeof(YourType)整列が適切に機能することを確認するために、タイプが問題にならないようにユニオントリックを使用します(整列方法を伝えるために使用するだけです)。

于 2013-07-25T14:41:01.843 に答える