Apa yang terjadi di balik layar?
Menurut definisi, yang dialokasikan secara non-dinamis adalah sebuah wadah berukuran tetap dari elemen-elemen homogen. Array Nelemen tipe Tdiletakkan dalam memori sebagai urutan yang berdekatan dari Nobjek tipe T.
Mengapa array harus memiliki tipe yang mencakup ukurannya?
Saya tidak percaya itu "perlu" untuk jenis array untuk memasukkan ukurannya - sebagai fakta, Anda dapat menggunakan pointer untuk merujuk ke urutan Tobjek yang berdekatan . Pointer tersebut akan kehilangan informasi ukuran tentang array.
Namun, hal ini berguna untuk dimiliki. Ini meningkatkan keamanan jenis, dan menyandikan informasi berguna pada waktu kompilasi yang dapat digunakan dalam berbagai cara. Sebagai contoh, Anda dapat menggunakan referensi-ke-array untuk membebani array dengan ukuran yang berbeda
void foo(int(&array)[4]) { /* ... */ }
void foo(int(&array)[8]) { /* ... */ }
atau untuk mengetahui ukuran array sebagai ekspresi konstan
template <typename T, std::size_t N>
constexpr auto sizeOf(const T(&array)[N]) { return N; }
Bagaimana ini akan memengaruhi membandingkan array?
Sebenarnya tidak.
Anda tidak dapat membandingkan array gaya-C dengan cara yang sama seperti membandingkan dua angka (misalnya intobjek). Anda harus menulis semacam perbandingan leksikografis, dan memutuskan apa artinya untuk koleksi dengan ukuran berbeda. std::vector<T>menyediakan itu , dan logika yang sama dapat diterapkan ke array.
Bonus: C ++ 11 dan di atasnya menyediakan std::array, yang merupakan pembungkus di sekitar larik C-style dengan antarmuka seperti wadah. Itu harus disukai untuk array gaya-C karena lebih konsisten dengan wadah lain (misalnya std::vector<T>), dan juga mendukung perbandingan leksikografis di luar kotak.