Saya harap Anda menyadari bahwa semua ini sangat ditentukan oleh implementasi, baik untuk Java dan C ++. Yang sedang berkata, model objek Java membutuhkan sedikit ruang.
Objek C ++ tidak (umumnya) membutuhkan penyimpanan apa pun kecuali apa yang dibutuhkan anggota. Perhatikan bahwa (tidak seperti Java, di mana semua yang didefinisikan pengguna adalah tipe referensi), kode klien dapat menggunakan objek baik sebagai tipe nilai atau sebagai tipe referensi, yaitu suatu objek dapat menyimpan pointer / referensi ke objek lain, atau menyimpan objek secara langsung tanpa tipuan. Satu pointer tambahan per objek diperlukan jika ada virtual
metode, tetapi beberapa kelas yang berguna dirancang untuk bergaul tanpa polimorfisme dan tidak memerlukan ini. Tidak ada metadata GC dan tidak ada kunci per objek. Dengan demikian class IntWrapper { int x; public: IntWrapper(int); ... };
objek tidak membutuhkan lebih banyak ruang daripada int
s polos , dan dapat ditempatkan langsung (yaitu tanpa tipuan) dalam koleksi dan objek lainnya.
Array rumit hanya karena tidak ada yang dibuat sebelumnya, setara dengan Java Array di C ++. Anda dapat dengan mudah mengalokasikan banyak objek dengan new[]
(sama sekali tidak ada overhead / metadata) tetapi tidak ada bidang panjang - implementasinya mungkin menyimpan satu tetapi Anda tidak dapat mengaksesnya. std::vector
adalah array dinamis dan karenanya memiliki overhead tambahan dan antarmuka yang lebih besar. std::array
dan array gaya-C (int arr[N];
), perlu konstanta waktu kompilasi. Secara teori, seharusnya hanya penyimpanan objek ditambah bilangan bulat tunggal untuk panjangnya - tetapi karena Anda bisa mendapatkan pengubahan ukuran dinamis dan antarmuka berfitur lengkap dengan ruang ekstra yang sangat sedikit, Anda hanya perlu melakukannya dalam praktik. Perhatikan bahwa semua ini, serta semua koleksi lainnya, default untuk menyimpan objek berdasarkan nilai, sehingga menghemat tipuan dan ruang untuk referensi, dan meningkatkan perilaku cache. Anda harus menyimpan pointer secara eksplisit (yang pintar, tolong) untuk mendapatkan tipuan.
Perbandingan di atas tidak sepenuhnya adil, karena beberapa penghematan ini diberikan dengan tidak menyertakan fitur yang disertakan Java, dan yang setara dengan C ++ sering kurang dioptimalkan dibandingkan dengan yang setara dengan Java (*). Cara umum untuk mengimplementasikan virtual
C ++ memaksakan overhead yang sama persis dengan cara umum untuk mengimplementasikan virtual
di Jawa. Untuk mendapatkan kunci, Anda memerlukan objek mutex fitur lengkap, yang kemungkinan besar lebih besar dari beberapa bit. Untuk mendapatkan penghitungan referensi ( tidaksetara dengan GC, dan tidak boleh digunakan seperti itu, tetapi terkadang bermanfaat), Anda memerlukan penunjuk cerdas yang menambahkan bidang jumlah referensi. Kecuali objek dibangun dengan hati-hati, jumlah referensi, objek pointer pintar, dan objek referensi berada di lokasi yang benar-benar terpisah, dan bahkan ketika Anda membuatnya dengan benar, pointer yang dibagikan mungkin (harus?) Masih berupa dua pointer, bukan satu. Kemudian lagi, gaya C ++ yang baik tidak menggunakan fitur-fitur ini cukup untuk masalah - dalam prakteknya, objek perpustakaan C ++ yang ditulis dengan baik menggunakan lebih sedikit. Itu tidak selalu berarti lebih sedikit penggunaan memori secara keseluruhan, tetapi itu berarti C ++ memiliki awal yang baik dalam hal ini.
(*) Misalnya, Anda bisa mendapatkan panggilan virtual, kode hash identitas dan penguncian dengan hanya satu kata untuk beberapa objek (dan dua kata untuk banyak objek lainnya) dengan menggabungkan informasi jenis dengan berbagai flag, dan menghapus bit kunci untuk objek yang tidak mungkin membutuhkan kunci. Lihat Implementasi Java Object Model (PDF) yang Efisien Ruang dan Waktu oleh David F. Bacon, Stephen J. Fink, dan David Grove untuk penjelasan terperinci tentang ini dan optimisasi lainnya.
int
? Jika demikian, Anda harus membandingkannya denganint
di Java, tidakInteger
- selama int C ++ Anda 32bits.