C 標準の std::array のサイズ
std::array の C 11 仕様では、連続ストレージと同等のパフォーマンスが保証されます。通常の配列。ただし、std::array が標準配列と同じサイズとメモリ レイアウトを持つかどうかという疑問が生じます。
標準の §23.3.2.1/2 によると、配列は次のことができる集合体です。次の構文を使用して初期化されます:
std::array<T, N> a = { initializer-list };
集合体として、std::array は初期化子リストの値を格納する必要があります 直接。 std::array が補助データを格納したり、通常の配列とアライメントが異なることは理論的には可能ですが、そのような可能性は非常に低いです。
実際には、ほとんどのコンパイラは std::array を連続したブロックとして扱います。通常の配列と同じサイズとレイアウトを持つメモリ。この動作はサードパーティのドキュメントでサポートされており、さまざまなコンパイラで確認されています。
たとえば、std::array に多次元配列ポインタとしてアクセスする次のコードは、期待どおりに動作します。
std::vector<std::array<int, N>> x(M); typedef int (*ArrayPointer)[N]; ArrayPointer y = (ArrayPointer)&x[0][0]; // use y like normal multidimensional array
これらの観察に基づいて、一般に次のように想定するのが安全です:
sizeof(std::array<int, N>) == sizeof(int) * N
ただし、注意することが重要です。この動作は標準によって厳密に保証されているわけではありません。コンパイラーは std::array の実装方法にある程度の柔軟性を持っており、標準の将来のリビジョンではこの動作が変更される可能性があります。
以上が`std::array` は通常の C 配列と同じサイズとメモリ レイアウトを持っていますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。