Ketika kami memeriksa ukuran fungsi menggunakan sizeof()
, kami selalu mendapatkan 1 byte . Apa yang dimaksud dengan 1 byte ini?
87
Ini adalah pelanggaran batasan, dan kompilator Anda harus mendiagnosisnya. Jika mengkompilasinya terlepas dari itu, program Anda memiliki perilaku yang tidak terdefinisi [terima kasih kepada @Steve Jessop untuk klarifikasi mode kegagalan, dan lihat jawaban @Michael Burr untuk mengapa beberapa kompiler mengizinkan ini]: Dari C11, 6.5.3.4./ 1:
The
sizeof
Operator tidak akan diterapkan pada ekspresi yang memiliki jenis fungsi
-pedantic
), Anda memiliki kompilator yang tidak sesuai dan setiap program memiliki perilaku yang tidak ditentukan.-std=c11
, bukangnu11
. Ini adalah ekstensi kompiler yang sangat aneh.sizeof(void)
1 di GNU C.-std=c11
: seseorang harus merujuk-std=c*
opsi ke Standar Periklanan. Mereka tidak mengaktifkan mode kesesuaian, mereka hanya menonaktifkan ekstensi yang akan mencegah program yang terbentuk dengan baik dari kompilasi (sepertitypeof
menjadi kata kunci, karena program C yang terbentuk dengan baik dapat menggunakannya sebagai nama variabel, tetapigcc
secara default akan menolaknya. ). Selain itu, untuk menonaktifkan ekstensi yang memungkinkan program yang rusak lolos tidak terdiagnosis, Anda memerlukan-pedantic
atau-pedantic-errors
.Ini bukan perilaku tidak terdefinisi - standar bahasa C memerlukan diagnostik saat menggunakan
sizeof
operator dengan penunjuk fungsi (nama fungsi) karena ini merupakan pelanggaran batasan untuksizeof
operator.Namun, sebagai ekstensi ke bahasa C, GCC memungkinkan aritmatika pada
void
pointer dan pointer fungsi, yang dilakukan dengan memperlakukan ukuran avoid
atau fungsi sebagai1
. Akibatnya,sizeof
operator akan mengevaluasi ke1
untukvoid
atau fungsi dengan GCC. Lihat http://gcc.gnu.org/onlinedocs/gcc/Pointer-Arith.html#Pointer-ArithAnda bisa membuat GCC mengeluarkan peringatan saat menggunakan
sizeof
dengan operand ini dengan menggunakan opsi-pedantic
atau-Wpointer-arith
ke GCC. Atau buat kesalahan dengan-Werror=pointer-arith
.sumber
sizeof
fungsinya bukan UB (yang saya sebutkan cukup banyak hanya karena jawaban lain menyatakan itu UB). Tapi mungkin saya mengacaukannya karena cara saya menyusun kalimat. Agar lebih jelas.sizeof
fungsi bukan UB (seperti yang diklaim beberapa jawaban). Ini adalah pelanggaran batasan. Oleh karena itu, diperlukan diagnosis. GCC mengizinkannya sebagai ekstensi.Ini menandakan bahwa penulis penyusun memutuskan nilai 1 daripada membuat setan terbang dari hidung Anda (memang, itu adalah penggunaan lain yang tidak ditentukan
sizeof
yang memberi kita ungkapan: "kompiler C itu sendiri HARUS mengeluarkan diagnostik JIKA ini yang pertama diperlukan diagnostik yang dihasilkan dari program Anda, dan kemudian MUNGKIN itu sendiri menyebabkan setan terbang dari hidung Anda (yang, omong-omong, bisa menjadi pesan diagnostik yang terdokumentasi) sama seperti MUNGKIN mengeluarkan diagnostik lebih lanjut untuk pelanggaran lebih lanjut terhadap aturan atau batasan sintaksis (atau, dalam hal ini, untuk alasan apa pun yang dipilihnya). " https://groups.google.com/forum/?fromgroups=#!msg/comp.std.c/ycpVKxTZkgw/S2hHdTbv4d8JDari sini ada istilah gaul "setan hidung" untuk apa pun yang diputuskan oleh penyusun untuk dilakukan sebagai respons terhadap konstruksi yang tidak ditentukan.
1
adalah setan hidung dari penyusun ini untuk kasus ini.sumber
Seperti yang ditunjukkan orang lain, sizeof () dapat mengambil pengenal yang valid, tetapi itu tidak akan mengembalikan hasil yang valid (jujur benar dan valid) untuk nama fungsi. Selain itu, hal itu pasti mungkin, atau mungkin tidak, mengakibatkan sindrom "setan keluar dari hidung".
Jika Anda ingin membuat profil ukuran fungsi program Anda, periksa peta linker, yang dapat ditemukan di direktori hasil menengah (tempat hal-hal dikompilasi ke dalam .obj / .o atau tempat gambar / file yang dapat dieksekusi diletakkan). Kadang-kadang ada opsi untuk membuat atau tidak file peta ini ... itu bergantung pada compiler / linker.
Jika Anda menginginkan ukuran pointer ke suatu fungsi, semuanya berukuran sama, ukuran kata pengalamatan di cpu Anda.
sumber
int x = 1;
tetapi hanya satu dari yang diizinkan untuk kompilator yang memenuhi standar. Dengansizeof()
diterapkan ke suatu fungsi, itu mungkin atau mungkin tidak mengembalikan nilai yang ditetapkan, atau menolak untuk dikompilasi, atau mengembalikan nilai acak berdasarkan apa pun yang ada di register tertentu pada saat itu. Setan hidung harfiah tidak mungkin, tetapi dalam huruf standar.sizeof
ke penunjuk ke suatu fungsi.