Pertanyaan Apakah ukuran std :: array ditentukan oleh standar


Di C ++ 11 std::array didefinisikan memiliki penyimpanan dan kinerja yang berdekatan yang tidak lebih buruk dari array, tetapi saya tidak dapat memutuskan apakah berbagai persyaratan standar menyiratkan bahwa std :: array memiliki ukuran dan tata letak memori yang sama sebagai array normal. Itu bisa Anda andalkan sizeof(std::array<int,N>) == sizeof(int)*N atau apakah implementasi itu spesifik?

Secara khusus, apakah ini dijamin bekerja seperti yang Anda harapkan:

std::vector< std::array<int, N> > x(M);
typedef (*ArrayPointer)[N];
ArrayPointer y = (ArrayPointer) &x[0][0];
// use y like normal multidimensional array

Ia bekerja di dua kompiler yang saya coba (GNU & Intel). Selanjutnya, semua dokumentasi pihak ke-3 yang bisa saya temukan (seperti ini), menyatakan bahwa std :: array hanya sebagai memori efisien sebagai array biasa, yang dikombinasikan dengan persyaratan yang berdekatan akan menyiratkan bahwa itu harus memiliki tata letak memori yang sama. Namun saya tidak dapat menemukan persyaratan ini dalam standar.


32
2017-09-30 20:29


asal


Jawaban:


Nya hampir wajib. Secara khusus, §23.3.2.1 / 2 mengatakan:

Array adalah agregat (8.5.1) yang dapat diinisialisasi dengan sintaks

array<T, N> a = { initializer-list };

dimana initializer-list adalah daftar yang dipisahkan koma dari elemen N hingga yang jenisnya dapat dikonversi ke T.

Karena ini agregat, ia tidak dapat menggunakan konstruktor apa pun untuk mengonversi data dalam daftar penginisialisasi ke format yang benar. Itu benar-benar hanya meninggalkan satu kemungkinan: tentang satu-satunya hal yang dapat disimpan adalah nilai-nilai itu sendiri.

Saya kira itu akan menjadi mungkin untuk suatu std::array untuk menyimpan semacam data tambahan yang mengikuti data yang ditentukan, seperti set memori ekstra ke beberapa nilai yang telah ditentukan, jadi jika Anda menulis melewati ujung larik, Anda mungkin akan mengubah data tersebut. Compiler / run-time akan memeriksa nilai-nilai tersebut saat shut-down, dan jika Anda mengubah nilainya, laporkan perilaku kode Anda yang tidak terdefinisi.

Ada juga kemungkinan kompilator bisa lakukan padding / pelurusan berbeda untuk sebuah std::array selain untuk array built-in. Salah satu contoh nyata yang mungkin diinginkan ini adalah untuk mendukung persyaratan penyelarasan super, seperti data untuk digunakan dengan instruksi SSE Intel. Array bawaan tidak bisa mendukung super-alignment, tapi saya berpikir spesifikasi std::array mungkin hampir tidak cukup longgar untuk memungkinkannya.

Intinya: tanpa mempertanyakan berapa banyak kemungkinan yang mungkin ada, cukup jelas itu std::array tidak harus mengikuti aturan yang Anda tanyakan.


25
2017-09-30 20:50