Saya bertanya-tanya apa yang bisa menjadi ukuran objek dari kelas kosong . Ini pasti tidak boleh 0 byte karena harus memungkinkan untuk referensi dan menunjuk ke sana seperti objek lain. Tapi, seberapa besar benda seperti itu?
Saya menggunakan program kecil ini:
#include <iostream>
using namespace std;
class Empty {};
int main()
{
Empty e;
cerr << sizeof(e) << endl;
return 0;
}
Output yang saya dapatkan pada kompiler Visual C ++ dan Cygwin-g ++ adalah 1 byte ! Ini sedikit mengejutkan saya karena saya mengharapkannya seukuran kata mesin (32 bit atau 4 byte).
Adakah yang bisa menjelaskan mengapa ukuran 1 byte? Mengapa tidak 4 byte? Apakah ini tergantung pada kompiler atau mesin juga? Juga, dapatkah seseorang memberikan alasan yang lebih meyakinkan mengapa objek kelas kosong tidak berukuran 0 byte?
Jawaban:
Mengutip FAQ Teknik dan Gaya C ++ dari Bjarne Stroustrup , alasan ukurannya bukan nol adalah "Untuk memastikan bahwa alamat dari dua objek yang berbeda akan berbeda." Dan ukurannya bisa 1 karena kesejajaran tidak penting di sini, karena tidak ada yang benar-benar perlu dilihat.
sumber
new
; ketika ruang dialokasikan, alokasi lain harus memiliki alamat yang berbeda. Dan seterusnya. Belum tentu ada pointer yang terlibat dalam kelas kosong; mungkin ada petunjuk ke variabel (atau referensi, atau alokasi lokal / tumpukan), tetapi ukurannya tidak nol dan belum tentu ukuran penunjuk.Standar menyatakan bahwa semua objek turunan memiliki sizeof ()> = 1:
sumber
Itu benar-benar detail implementasi. Dahulu kala, saya pikir itu bisa menjadi nol byte atau seribu byte, yang tidak ada hubungannya dengan spesifikasi bahasa. Tetapi, setelah melihat standar (bagian 5.3.3),
sizeof
didefinisikan sebagai selalu mengembalikan satu atau lebih besar, tidak peduli apa.Ini diperlukan untuk, antara lain, memungkinkan Anda menangani array objek dan pointer ke sana. Jika elemen Anda dibiarkan berukuran nol maka
&(array[0])
akan identik dengan&(array[42])
, yang akan menyebabkan segala macam malapetaka pada loop pemrosesan Anda.Alasan mengapa ini mungkin bukan kata mesin adalah karena tidak ada elemen di dalamnya yang benar-benar memerlukannya untuk disejajarkan pada batas kata (seperti integer). Misalnya, jika Anda menempatkan
char x; int y;
di dalam kelas, GCC saya mencatatnya pada delapan byte (karena int kedua harus selaras dalam implementasi itu).sumber
Ada pengecualian: array dengan panjang 0
sumber
c
,&c[M] == &c[N]
untuk setiapM
danN
(clang ++ 4.1).Meskipun tidak diharuskan untuk menetapkan memori apapun untuk kelas kosong, namun untuk membuat objek kelas kosong, compiler memberikan memori minimum yang dapat ditetapkan, yaitu 1 byte. Dengan cara ini kompilator dapat membedakan dua objek dari kelas kosong yang sama secara unik, dan akan dapat menetapkan alamat objek ke penunjuk tipe kelas kosong.
sumber
Saya pikir mungkin berguna untuk menautkan ke jawaban yang menjelaskan hal ini juga. Ini adalah tentang
boost::compressed_pair
oleh Logan Capaldo .sumber
Ini dapat membantu Anda :-) http://bytes.com/topic/c/insights/660463-sizeof-empty-class-structure-1-a
sumber
Alokasi 1 byte untuk kelas kosong bergantung pada compiler. Kompiler perlu memastikan objek berada di lokasi memori yang berbeda dan mereka perlu mengalokasikan ukuran memori bukan nol ke objek. Dengarkan catatan tentang topik ini di sini: http://listenvoice.com/listenVoiceNote.aspx?id=27
Meskipun compiler mengalokasikan ukuran bukan nol ke kelas kosong, mereka juga melakukan pengoptimalan saat kelas baru diturunkan dari kelas kosong. Dengarkan tentang pengoptimalan basis kosong pada pertanyaan wawancara pemrograman c ++ ListenVoice.
sumber
alasan kelas yang tidak memiliki anggota data tetapi berukuran 1 byte adalah karena * teks yang kuat * ini harus disimpan dalam memori agar referensi atau penunjuk dapat menunjuk ke objek kelas tersebut
sumber
kelas kosong -kelas itu tidak berisi konten apa pun.
setiap kelas yang tidak kosong akan diwakili oleh isinya dalam memori.
sekarang bagaimana kelas kosong akan direpresentasikan dalam memori? karena tidak memiliki konten, tidak ada cara untuk menunjukkan keberadaannya dalam memori, tetapi kelas hadir, maka wajib menunjukkan keberadaannya dalam memori. Untuk menunjukkan keberadaan kelas kosong di memori, diperlukan 1 byte.
sumber
Saya rasa demikian karena 1 byte adalah unit memori terkecil yang dapat digunakan sebagai placeholder, dan tidak dapat memberikan ukuran nol karena tidak mungkin membuat array objek ..
dan hal yang Anda katakan "Ini sedikit mengejutkan saya karena saya mengharapkannya seukuran kata mesin (32 bit atau 4 byte)." akan benar untuk variabel referensi (kata-kata macine) tipe kosong (), bukan ukuran kelas itu sendiri (yang merupakan tipe data abstrak),
sumber
Saya pikir pertanyaan ini hanya untuk kepentingan teoritis tetapi tidak masalah dalam praktiknya.
Seperti yang telah ditunjukkan oleh orang lain, berasal dari kelas kosong tidak membahayakan, karena ini tidak akan menghabiskan memori tambahan untuk bagian kelas dasar.
Selain itu, jika sebuah kelas kosong (artinya - secara teoritis - tidak memerlukan memori per-instance, yaitu tidak memiliki anggota data non-statis atau fungsi anggota virtual) maka semua fungsi anggotanya juga dapat (dan harus) didefinisikan sebagai statis. Jadi tidak perlu membuat instance dari kelas ini.
Intinya: Jika Anda menemukan diri Anda menulis kelas X yang kosong maka cukup buat semua fungsi anggota statis. Kemudian Anda tidak perlu membuat objek X, dan kelas turunan tidak akan terpengaruh dengan cara apa pun.
sumber
Output: Oke tidak masalah memiliki alamat yang berbeda
Mengembalikan ukuran 1 memastikan bahwa kedua objek tidak akan memiliki alamat yang sama.
sumber
Ini bukan nol untuk memastikan bahwa dua objek yang berbeda akan memiliki alamat yang berbeda. Objek yang berbeda harus memiliki alamat yang berbeda, sehingga ukuran kelas kosong selalu 1 byte.
sumber
Saya pikir jika ukuran kelas kosong adalah nol itu berarti tidak ada. Agar (kelas) ada, itu harus memiliki setidaknya 1 byte, karena byte ini adalah memori / alamat referensi.
sumber
Karena pointer ini , meskipun pointer adalah (integer) dari 4 byte tetapi mengacu pada satu lokasi memori (satu unit) yaitu 1 byte.
sumber