Saat membaca buku C ++ Primer, saya menemukan pernyataan ini: "Jumlah elemen dalam array adalah bagian dari tipe array." Jadi saya ingin mencari tahu menggunakan kode berikut:
#include<iostream>
int main()
{
char Array1[]{'H', 'e', 'l', 'p'};
char Array2[]{'P', 'l', 'e', 'a', 's', 'e'};
std::cout<<typeid(Array1).name()<<std::endl; //prints A4_c
std::cout<<typeid(Array2).name()<<std::endl; //prints A6_c
return 0;
}
Dan yang menarik, hasil dari typeid pada kedua array menunjukkan bahwa keduanya berbeda.
- Apa yang terjadi di balik layar?
- Mengapa array perlu memiliki tipe yang mencakup ukurannya? Apakah hanya karena ukurannya tidak boleh berubah?
- Bagaimana ini akan memengaruhi membandingkan array?
Hanya ingin bisa memahami konsep secara mendalam.
Jawaban:
Menurut definisi, yang dialokasikan secara non-dinamis adalah sebuah wadah berukuran tetap dari elemen-elemen homogen. Array
N
elemen tipeT
diletakkan dalam memori sebagai urutan yang berdekatan dariN
objek tipeT
.Saya tidak percaya itu "perlu" untuk jenis array untuk memasukkan ukurannya - sebagai fakta, Anda dapat menggunakan pointer untuk merujuk ke urutan
T
objek 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
atau untuk mengetahui ukuran array sebagai ekspresi konstan
Sebenarnya tidak.
Anda tidak dapat membandingkan array gaya-C dengan cara yang sama seperti membandingkan dua angka (misalnya
int
objek). 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 (misalnyastd::vector<T>
), dan juga mendukung perbandingan leksikografis di luar kotak.sumber
std::equal
(viastd::begin
danstd::end
yang didefinisikan untuk array). Dalam hal ini, array ukuran yang berbeda tidak sama.Jumlah ruang yang dialokasikan untuk objek saat Anda membuatnya tergantung sepenuhnya pada tipenya. Alokasi yang saya bicarakan bukan alokasi dari
new
ataumalloc
, tetapi ruang yang dialokasikan sehingga Anda dapat menjalankan konstruktor dan menginisialisasi objek Anda.Jika Anda memiliki struct yang didefinisikan sebagai (misalnya)
Kemudian ketika Anda membangun objek:
Anda dapat menganggap proses membangun objek sebagai proses:
'a'
dan'b'
ke objek)Penting untuk dicatat bahwa 2 byte ruang yang dibutuhkan sepenuhnya ditentukan oleh jenis objek, argumen ke fungsi tidak masalah. Jadi, untuk sebuah array prosesnya sama, kecuali sekarang jumlah ruang yang dibutuhkan tergantung pada jumlah elemen dalam array.
Jadi jenis
a
danb
harus mencerminkan fakta yanga
membutuhkan ruang yang cukup untuk 1 karakter danb
kebutuhan ruang yang cukup untuk 5 karakter. Itu berarti bahwa ukuran array ini tidak dapat tiba-tiba berubah, setelah array 5-elemen dibuat itu selalu array 5-elemen. Untuk memiliki objek mirip-array yang ukurannya dapat bervariasi, Anda perlu alokasi memori dinamis, yang harus dicakup buku Anda pada titik tertentu.sumber
Itu karena alasan internal untuk perpustakaan runtime. Jika Anda mempertimbangkan pernyataan berikut, misalnya:
Maka menjadi jelas apa masalahnya: Misalnya, pengalamatan
unsigned int *
harus berkaitan dengansizeof operator
atau pengalamatanunsigned int
.Ada penjelasan yang lebih rinci untuk sisa dari apa yang Anda lihat di sini, tetapi sebagian besar merupakan rekapitulasi dari apa yang tercakup dalam Bahasa Pemrograman C, Edisi ke-2 oleh Kernighan dan Ritchie mengenai program yang mencetak teks bahasa biasa dari jenis yang dinyatakan. tali.
sumber