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中文網其他相關文章!