Awalnya, ini adalah bagian dari pertanyaan lain .
Mengapa sizeof
disebut operator waktu kompilasi? Bukankah itu sebenarnya operator run-time? Dan jika itu memang operator waktu kompilasi, bagaimana hal itu membantu dalam menghasilkan kode portabel yang berjalan sama di komputer yang berbeda? Tolong jelaskan secara rinci.
sizeof(polymorphic_ptr*)
menjadi konstan sangat berlawanan dengan intuisi dan konyol. Ya, itu cara C ++, tapi tetap saja konyol.Jawaban:
sizeof()
memberi Anda ukuran tipe data , bukan ukuran instance tertentu dari tipe dalam memori.Misalnya, jika Anda memiliki objek data string yang mengalokasikan array karakter ukuran variabel saat runtime,
sizeof()
tidak dapat digunakan untuk menentukan ukuran array karakter itu. Itu hanya akan memberi Anda ukuran pointer.Ukuran tipe data selalu diketahui pada waktu kompilasi.
sumber
sizeof
array, Anda akan mendapatkan ukuran array (yaitu ukuran elemen dikalikan jumlah elemen). Tetapi jika Anda menggunakannya pada pointer, Anda hanya mendapatkan ukuran pointer. Jadi, karena dalam kebanyakan kasus di mana Anda ingin mengetahui ukuran sebuah array, Anda hanya memiliki sebuah pointer, itu tidak terlalu berguna.karena seluruh ukuran "panggilan" dihitung pada waktu kompilasi dan apa pun yang ada di antara kurung dibuang dan tidak dijalankan saat runtime,
hasilnya murni berdasarkan info tipe statis yang tersedia untuk kompiler
sumber
Karena, pada waktu kompilasi, kompiler menghitung ukuran ekspresi dan pengganti yang mengkompilasi nilai konstanta waktu.
Tidak. Anda bahkan dapat menggunakan
sizeof
untuk mengevaluasi ukuran ekspresi yang tidak dapat Anda jalankan secara hukum (yaitu, yang akan menimbulkan Perilaku Tidak Terdefinisi), selama kompilator dapat mengetahui apa jenis ekspresi itu.Juga, bahkan sebelum C ++ 11
constexpr
, Anda bisa menggunakansizeof
ekspresi dengan cara yang tidak bisa Anda gunakan dengan ekspresi run-time.Jenis dapat bervariasi dalam ukuran pada platform yang berbeda. Menggunakan
sizeof
ekspresi alih-alih asumsi hard-coded berarti kode Anda tidak akan rusak ketika Anda mengkompilasi pada platform yang berbeda dan tipe Anda berubah ukuran.sumber
C ++ sebenarnya tidak menyimpan metadata untuk objek saat runtime sehingga pemeriksaan ukuran harus waktu kompilasi. Untuk contoh bagaimana C ++ tidak memvalidasi ukuran, deklarasikan array
int
dari beberapa ukuran arbitrer dan baca setelah itu. Jika Anda beruntung, Anda akan mendapatkansegfault
tetapi lebih mungkin Anda hanya membaca omong kosong, karena C ++ tidak melacak ukuran array Anda.Lihat Bisakah program C / C ++ membuat kesalahan dari pembacaan melewati akhir array (UNIX)? untuk contoh dari SO.
sumber