すべてのオブジェクト型 T に対して、sizeof(T) >= alignof(T) が常に成立しますか? 質問する

すべてのオブジェクト型 T に対して、sizeof(T) >= alignof(T) が常に成立しますか? 質問する

任意のオブジェクト タイプについて、は常に 以上の大きさになりますTか?sizeof(T)alignof(T)

次のようにオブジェクトの配置を調整する場合でも、直感的にそう思えます。

struct small {
  char c;
};

通常よりも大きい場合、それらの「サイズ」も上方に調整され、配列内のオブジェクト間の関係が整列を維持しながら意味をなすようになります(少なくとも私の環境ではテスト)。 例えば:

struct alignas(16) small16 {
  char c;
};

サイズと配置は両方とも 16 です。

ベストアンサー1

少なくとも標準C++では、長さが1より大きい配列を作成できるものであれば、これは真になります。

Foo arr[2];

およびalignof(Foo) > sizeof(Foo)の場合、arr[0]と はarr[1]両方とも揃えることができません。

としてザルマン・スターンの例しかし、少なくとも一部のコンパイラでは、サイズよりも大きいアラインメントを持つ型の宣言を許可しており、その結果、コンパイラはその型の配列を宣言できないようになっています。これは標準に準拠したC++ではありません(型属性を使用しているため、GCCの拡張機能であるalignof(T) > sizeof(T))ですが、実際には持つことができることを意味します。

配列引数は を想定しておりsizeof(Foo) > 0、これは標準でサポートされているどの型にも当てはまりますが、o11c ショーコンパイラ拡張によってその保証が破られる例: 一部のコンパイラでは、長さ 0 の配列 (0sizeofおよび正の数) が許可されますalignof

おすすめ記事