Saya telah melihat dua gaya penggunaan sizeof
untuk operasi yang berhubungan dengan memori (seperti dalam memset
atau malloc
):
sizeof(type)
, dansizeof variable
atausizeof(variable)
Yang mana yang Anda inginkan, atau Anda akan menggunakan campuran dari dua gaya, dan kapan Anda akan menggunakan masing-masing gaya? Apa pro dan kontra dari masing-masing gaya dan kapan Anda menggunakannya?
Sebagai contoh, saya dapat melihat pasangan situasi berikut di mana satu gaya membantu dan yang lainnya tidak:
Ketika Anda mendapatkan pointer tipuan salah:
type *var;
...
memset(var, 0, sizeof var); /* oops */
Ketika jenisnya berubah:
new_type var; /* changed from old_type to new_type */
...
memset(&var, 0, sizeof(old_type)); /* oops */
sumber
array
memang array C, makasizeof(array)
mengembalikan jumlah byte yang diperlukan untuk menyimpan elemen array . Jikaarray
adalah pointer ke elemen pertama dari array C yang rusak, maka pernyataan Anda berlaku. Melewati C array sebagai argumen fungsi membuatnya tampak seperti pointer dalam fungsi - semua informasi membuktikan itu sebuah array, seperti ukurannya, hilang. Itu sebabnya busuk . Salah 2: "array tidak benar-benar ada di C; ... hanya sintaksis gula untuk pointer."Preferensi (seperti biasa) adalah untuk mencerminkan niat Anda secara langsung.
Apakah niat untuk beroperasi melawan memori variabel yang ada? Jika demikian, maka gunakan
sizeof(variable)
, sebagai acara ini sedekat mungkin bahwa itu variabel memori itu sendiri bahwa Anda peduli.Adalah niat untuk melakukan beberapa perhitungan pada jenis, misalnya untuk menentukan berapa banyak memori yang harus dialokasikan untuk contoh baru? Jika demikian, maka gunakan
sizeof(type)
.Yaitu, saya lebih suka
lebih
karena case terakhir sepertinya Anda sedang mencoba mengakses variabel yang belum ada.
Di sisi lain, saya lebih suka
lebih
sebagai niat jelas untuk nol-mengisi isi dari variabel, sehingga variabel kita harus beroperasi melawan. Mencoba menggunakan tipe metadata hanya membingungkan hal-hal di sini.
sumber
void *
itu secara otomatis dilemparkan ke jenis pointer lain sebagai kesalahan.Saya akan jauh lebih suka
sizeof(type)
lebihsizeof variable
. Meskipun memaksa Anda untuk khawatir tentang jenis dan membuat perubahan yang lebih, hal ini membantu Anda menghindari kesalahan pointer tipuan, yang peringkat di antara penyebab paling umum dari bug di C .Saya tidak akan terlalu khawatir tentang bug di mana jenisnya
sizeof(type)
berubah; setiap kali Anda mengubah jenis variabel, Anda harus melakukan pemindaian cepat untuk melihat di mana variabel itu digunakan dan jika Anda perlu mengubahsizeof(type)
pernyataan apa pun . Meskipun selalu ada kemungkinan untuk mendapatkan ini salah, ia memiliki risiko yang jauh lebih rendah daripada kesalahan tipuan pointer.Salah satu keuntungannya
sizeof variable
adalah untuk array, tetapi dalam praktiknya saya telah menemukan bahwa melewati array sebagai pasangan pertama / len jauh lebih umum (dalam hal ini hanya menggunakan panjangnya), plus itu juga sangat mudah untuk mendapatkan ukuran yang salah karena peluruhan array / pointer, seperti dalam contoh ini:sumber
sizeof var
; jika itu adalah pointer itusizeof *var
. Ini juga sesuatu yang orang bisa salah, dan kompiler akan dengan senang hati mengambilnya tanpa keluhan. Saya berpendapat bahwa kesalahan-kesalahan ini jauh lebih sulit dikenali, dan lebih umum, daripada kesalahan dalamsizeof(type)
bentuk.C
, memposting kode C lebih informatif daripada kode C ++mat3_t::mat3_t(...)
.Tujuannya adalah untuk menghapus redundansi. Jika Anda menggunakan sizeof untuk operasi yang terkait dengan variabel, maka jelas Anda harus mencerminkannya dalam sizeof. Ya, Anda dapat mengacaukan seperti pada contoh pertama, tetapi obatnya tidak menggunakan tipe, tetapi * var, dengan benar sesuai dengan tujuannya.
Untuk mengurangi masalah seperti itu, biasanya menggunakan makro, templat, dan alat serupa yang dilatih untuk use case alih-alih ukuran telanjang.
Lihat makro CLEAR saya yang digunakan secara eksklusif, bukan memset telanjang. Menyelamatkan pantat saya beberapa kali dalam kasus kesalahan tipuan atau ketika konten struct mengambil vektor atau string ...
sumber
Logika bisnis menentukan pilihan Anda.
Jika kode Anda merujuk ke variabel tertentu dan tanpa variabel ini kode Anda tidak masuk akal - pilih
sizeof(var)
Jika kode Anda berkaitan dengan serangkaian variabel dengan tipe tertentu - pilih
sizeof(type)
. Biasanya Anda memerlukan ini jika Anda memilikitypedef
yang mendefinisikan banyak variabel yang Anda proses berbeda berdasarkan jenisnya (misalnya serialisasi). Anda mungkin tidak tahu mana dari variabel-variabel ini yang akan tetap dalam versi kode masa depan sehingga memilih jenis sebagai argumen secara logis benar. Bahkan mengubah sepertitypedef
itu tidak akan mempengaruhi garis sizeof Anda.sumber
Tergantung pada tujuan sizeof (variabel) bisa menjadi solusi terbaik. Dengan cara itu, Anda dapat mengubah jenis variabel Anda jika perlu, tanpa memperbaiki semua entri untuk jenis itu. Tetapi sekali lagi, itu tergantung pada tujuan Anda.
sumber