std::array のサイズは標準によって強制されていますか?
C 11 では、std::array は連続していることが保証されています通常のアレイを上回るストレージとパフォーマンスを実現します。ただし、疑問は残ります: 標準では std::array のサイズとメモリ レイアウトが明示的に定義されていますか?
標準の要件の探索
標準では std:: が定義されています。構文を使用して初期化できる集合体としての配列:
std::array<T, N> a = { initializer-list };
As集合体の場合、 std::array はコンストラクターを使用して初期化子リストからのデータを変換できません。これは、配列が主に値自体を格納することを意味します。
予想される動作からの逸脱の可能性
技術的には、標準では特定の潜在的な逸脱が禁止されていません:
コンパイラのバリエーション
標準の曖昧さにもかかわらず、GNU や Intel などの主要なコンパイラでの実際の使用法では、std::array のサイズとメモリ レイアウトがミラーリングされることが示唆されています。
std::vector< std::array<int, N> > x(M); typedef int (*ArrayPointer)[N]; ArrayPointer y = (ArrayPointer) &x[0][0]; // Safe multidimensional array-like usage
これは重要です。このコードは期待どおりに機能しますが、すべての実装がこのパターンに従うという保証はないことに注意してください。したがって、ミッションクリティカルなコードでは、この動作に依存することはお勧めできません。
以上がC 標準は「std::array」のサイズとメモリ レイアウトを保証していますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。