ホームページ > バックエンド開発 > C++ > `std::array` は通常の C 配列と同じサイズとメモリ レイアウトを持っていますか?

`std::array` は通常の C 配列と同じサイズとメモリ レイアウトを持っていますか?

Barbara Streisand
リリース: 2024-12-06 22:10:13
オリジナル
149 人が閲覧しました

Does `std::array` have the same size and memory layout as a regular C   array?

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 サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート