60

new char[sizeof(T)]タイプに対して適切にアラインメントされたメモリを割り当てることを保証することでバッファを割り当てていますT。ここで、のすべてのメンバーTは、自然な実装定義のアラインメントを持っています(つまり、alignasキーワードを使用してアラインメントを変更していません)。

私はこの保証がこのあたりのいくつかの答えでなされているのを見てきましたが、標準がこの保証にどのように到達するかは完全にはわかりません。標準の5.3.4-10は、基本的な要件を示しています。基本的にnew char[]はに位置合わせする必要がありますmax_align_t

私が見逃しているのはalignof(T)、最大値が常に有効なアライメントになるというビットですmax_align_t。つまり、それは明白に思えますが、結果として生じる構造の整列はせいぜいである必要がありmax_align_tますか?ポイント3.11-3でさえ、拡張アラインメントがサポートされる可能性があると述べているので、コンパイラーは、クラスがオーバーアラインメントされたタイプであると独自に判断できますか?

4

2 に答える 2

18

new char[N]と式new unsigned char[N]は、すべてのオブジェクトに対して十分にアラインされたメモリを返すことが保証されています。§5.3.4/10 を参照してください "[...] char および unsigned char の配列の場合、new-expression の結果と割り当て関数によって返されるアドレスの差は、最も厳密な基本アライメント要件の整数倍でなければなりません(3.11) サイズが作成される配列のサイズを超えない任意のオブジェクト型の [ 注: 割り当て関数は、基本的なアラインメントを持つ任意の型のオブジェクトに対して適切にアラインされたストレージへのポインターを返すと想定されるため、この制約は配列割り当てのオーバーヘッドにより、後で他の型のオブジェクトが配置される文字配列を割り当てる一般的なイディオムが可能になります。

もちろん、文体の観点からは、生のメモリを割り当てることが必要な場合は、次のように言う方が明確ですoperator new(N)。概念的には、 new char[N]作成しN charます。バイトをoperator new(N)割り当てます。N

于 2012-05-14T18:31:10.590 に答える
6

私が見逃しているのはalignof(T)、最大値が常に有効なアライメントであるというビットですmax_align_t。つまり、明らかなように思えますが、結果として得られる構造体のアライメントはせいぜい である必要がありmax_align_tますか? ポイント3.11-3でさえ、拡張アラインメントがサポートされている可能性があると述べているため、コンパイラはクラスがオーバーアラインされた型であると独自に判断できますか?

Mankarse が指摘したように、私が得ることができる最高の引用は[basic.align]/3からのものです。

拡張アラインメント要件を持つ型は、過剰にアラインされた型です。[ 注: すべてのオーバーアラインされた型は、(おそらく非静的データ メンバーを介して) 拡張アラインメントが適用されるクラス型であるか、クラス型を含みます。—終わりのメモ]

これは、拡張アラインメントが明示的に必要である(そして伝播する)必要があることを暗示しているようですが、できません

もっと明確に言及したいと思います。意図はコンパイラライターにとって明らかであり、他の動作は正気ではありませんが、それでも...

于 2012-05-14T17:28:37.020 に答える