Pengumpulan sampah pada dasarnya hanya berarti bahwa objek yang dialokasikan Anda secara otomatis dirilis pada beberapa titik setelah mereka tidak dapat dijangkau lagi.
Lebih tepatnya, mereka dilepaskan ketika mereka menjadi tidak terjangkau untuk program ini, karena objek yang dirujuk secara melingkar tidak akan pernah dirilis sebaliknya.
Pointer pintar hanya merujuk pada struktur apa pun yang berperilaku seperti pointer biasa tetapi memiliki beberapa fungsi tambahan yang terpasang. Ini termasuk tetapi tidak terbatas pada deallokasi, tetapi juga copy-on-write, cek terikat, ...
Sekarang, seperti yang telah Anda nyatakan, smart pointer dapat digunakan untuk mengimplementasikan bentuk pengumpulan sampah.
Tetapi alur pemikiran berjalan seperti berikut:
- Pengumpulan sampah adalah hal yang keren untuk dimiliki, karena nyaman dan saya harus mengurus lebih sedikit barang
- Karena itu: Saya ingin pengumpulan sampah dalam bahasa saya
- Sekarang, bagaimana cara memasukkan GC ke dalam bahasa saya?
Tentu saja, Anda dapat mendesainnya seperti ini dari awal. C # dirancang untuk menjadi sampah yang dikumpulkan, jadi hanya new
objek Anda dan itu akan dirilis ketika referensi keluar dari ruang lingkup. Cara ini dilakukan terserah kompiler.
Namun di C ++, tidak ada pengumpulan sampah yang dimaksudkan. Jika kita mengalokasikan beberapa pointer int* p = new int;
dan jatuh keluar dari ruang lingkup, p
itu sendiri dihapus dari stack, tetapi tidak ada yang mengurus memori yang dialokasikan.
Sekarang satu-satunya yang Anda miliki dari awal adalah destruktor deterministik . Ketika suatu objek meninggalkan ruang lingkup yang telah dibuat, destruktornya disebut. Dalam kombinasi dengan templat dan overloading operator, Anda bisa mendesain objek pembungkus yang berperilaku seperti pointer, tetapi menggunakan fungsionalitas destruktor untuk membersihkan sumber daya yang melekat padanya (RAII). Anda menyebut ini penunjuk cerdas .
Ini semua sangat spesifik C ++: Overloading operator, templat, destruktor, ... Dalam situasi bahasa khusus ini, Anda telah mengembangkan pointer cerdas untuk memberi Anda GC yang Anda inginkan.
Tetapi jika Anda merancang bahasa dengan GC dari awal, ini hanyalah detail implementasi. Anda hanya mengatakan objek akan dibersihkan dan kompiler akan melakukan ini untuk Anda.
Pointer pintar seperti dalam C ++ tidak mungkin bahkan mungkin dalam bahasa seperti C #, yang tidak memiliki kehancuran deterministik sama sekali (C # bekerja di sekitar ini dengan menyediakan gula sintaksis untuk memanggil .Dispose()
objek tertentu). Sumber daya yang tidak direferensikan akhirnya akan direklamasi oleh GC, tetapi tidak ditentukan kapan tepatnya ini akan terjadi.
Dan ini, pada gilirannya, dapat memungkinkan GC melakukan tugasnya dengan lebih efisien. Dibangun lebih dalam ke dalam bahasa daripada smart pointer, yang ditetapkan di atasnya, .NET GC misalnya dapat menunda operasi memori dan melakukan mereka dalam blok untuk membuatnya lebih murah atau bahkan memindahkan memori untuk meningkatkan efisiensi berdasarkan seberapa sering objek diakses.