C ++, Toko Gratis vs Heap

124

Alokasi dinamis dengan new/deletedikatakan berlangsung di penyimpanan gratis ,
sementara malloc/freeoperasi menggunakan heap .

Saya ingin tahu apakah ada perbedaan yang sebenarnya, dalam praktiknya.
Apakah penyusun membuat perbedaan antara kedua istilah tersebut? ( Toko gratis dan Heap , bukan new/malloc)

Nick Dandoulakis
sumber

Jawaban:

76

Lihat http://www.gotw.ca/gotw/009.htm ; ini dapat menggambarkan perbedaan antara heap dan toko gratis jauh lebih baik daripada yang saya bisa:

Toko gratis:

Penyimpanan gratis adalah salah satu dari dua area memori dinamis, yang dialokasikan / dibebaskan oleh new / delete. Umur objek bisa kurang dari waktu penyimpanan dialokasikan; Artinya, objek penyimpanan gratis dapat memiliki memori yang dialokasikan tanpa segera diinisialisasi, dan dapat dimusnahkan tanpa alokasi memori segera. Selama periode ketika penyimpanan dialokasikan tetapi di luar masa pakai objek, penyimpanan dapat diakses dan dimanipulasi melalui void * tetapi tidak ada anggota nonstatis atau fungsi anggota proto-objek yang dapat diakses, alamatnya diambil, atau dimanipulasi .

Tumpukan:

Heap adalah area memori dinamis lainnya, yang dialokasikan / dibebaskan oleh malloc / free dan variannya. Perhatikan bahwa meskipun default global new dan delete mungkin diterapkan dalam istilah malloc dan gratis oleh kompiler tertentu, heap tidak sama dengan penyimpanan gratis dan memori yang dialokasikan di satu area tidak dapat dialokasikan dengan aman di area lain. Memori yang dialokasikan dari heap dapat digunakan untuk objek tipe kelas dengan penempatan-konstruksi baru dan penghancuran eksplisit. Jika digunakan, catatan tentang masa pakai objek toko gratis berlaku serupa di sini.

Michael Koval
sumber
23
Saya tidak setuju. Kata "heap" dalam konteks alokasi dinamis tidak digunakan oleh standar C ++ maupun C99 (saya tidak memiliki C89 yang dirujuk C ++, silakan koreksi saya jika menggunakan kata tersebut). Saya tidak dapat menemukan tanggal GotW yang dipermasalahkan diterbitkan, tetapi karena itu berbicara tentang draf, itu jelas pra-standar.
avakar
2
Ini semua pertanyaan tentang terminologi, imho. Katakan, mr. Stroustrup tidak membedakan 'heap' dan 'free store': stroustrup.com/Programming/17_free_store.ppt , slide 12. 'Heap' digunakan sebagai sinonim dari memori dinamis jauh sebelum C ++, sejak waktu Lisp (1960-an) yang digunakan struktur data heap untuk alokasi memori.
Alexey Voytenko
Saya biasanya menganggap heap (via maloc / free) sebagai semacam pemasok bahan 'mentah'. Anda meminta sepotong memori Anda mendapatkannya tanpa embel-embel. Anda harus membangun struktur apa pun sendiri. Toko Gratis (baru / hapus) lebih seperti pemasok 'barang jadi'. Anda meminta sebuah objek dan itu mendapat alokasi ruang, dan objek itu dibangun dan disiapkan untuk Anda gunakan. Setelah selesai dibersihkan dengan baik.
Anshuman Kumar
67

Untuk C ++, perbedaan antara penyimpanan gratis dan heap telah menjadi sepenuhnya konseptual. Seperti kendi untuk mengumpulkan serangga, dan satu lagi untuk mengumpulkan kue. Yang satu diberi label dengan satu cara, yang lainnya dengan yang lain. Penunjukan ini dimaksudkan untuk menunjukkan titik di mana Anda TIDAK PERNAH mencampur " new" dan " delete" dengan " malloc", " realloc", atau " free" (atau kumpulan level bit dalam hal ini).

Selama wawancara, ada baiknya untuk mengatakan bahwa " newdan deletegunakan penyimpanan gratis, mallocdan freegunakan heap; newdan deletepanggil konstruktor dan destruktor, bagaimanapun mallocdan freetidak." Namun, Anda akan sering mendengar bahwa segmen memori benar-benar berada di area yang sama - namun, bahwa BISA khusus untuk kompiler, artinya, keduanya dapat menetapkan ruang memori yang berbeda sebagai kumpulan (tidak yakin mengapa, meskipun).

Kit10
sumber
28

Jawaban Mike Koval mencakup teori itu dengan cukup baik. Dalam praktiknya, bagaimanapun, mereka hampir selalu merupakan region memori yang sama - dalam banyak kasus jika Anda menggali implementasi compiler new, Anda akan menemukannya memanggil malloc().

Dengan kata lain: dari sudut pandang mesin, heap dan penyimpanan gratis adalah hal yang sama. Perbedaannya ada di dalam kompiler.

Untuk membuat segalanya semakin membingungkan, sebelum munculnya C ++ kami mengatakan "heap" yang berarti apa yang sekarang disebut "toko gratis".

Crashworks
sumber
5

Istilah "heap" juga dapat merujuk pada struktur data tertentu, tetapi dalam konteks C ++ malloc, operasi free, new, dan delete, istilah "heap" dan "free store" digunakan lebih atau kurang secara bergantian.

Jim Lewis
sumber
3

Heap dan toko gratis seharusnya tidak dapat dioperasikan. Dalam konteks terbatas seperti pada pengontrol mikro AVR 8-bit dengan C ++ 11 Standard Library, mereka bahkan tidak dapat digunakan dalam program yang sama. Penyimpanan gratis dan heap melakukan alokasinya dalam ruang memori yang sama, saling menimpa struktur dan data. Dalam konteks ini, penyimpanan Gratis berbeda dan tidak kompatibel dengan Heap karena "perpustakaan toko baru / hapus gratis" lebih sederhana (dan lebih cepat) daripada "perpustakaan tumpukan Malloc / gratis / realoc / calloc" dan dengan demikian memberikan keuntungan penggunaan memori yang besar ke Pemrogram tertanam C ++ (dalam konteks di mana Anda hanya memiliki 512 byte RAM).

Lihat 8-bit c ++ 11/14 Standard Library di https://github.com/ambroise-leclerc/ETL/tree/master/libstd

Ambroise Leclerc
sumber
2

Saya tidak ingat standar yang pernah menyebutkan kata heap, kecuali dalam deskripsi fungsi heap seperti push_heapet al. Semua alokasi dinamis dilakukan di toko gratis.

avakar
sumber
1

Free Store adalah kumpulan memori heap yang tidak dialokasikan yang diberikan ke program yang digunakan oleh program untuk alokasi dinamis selama eksekusi program. Setiap program dilengkapi dengan kumpulan memori heap yang tidak dialokasikan yang dapat digunakan selama eksekusi. Kumpulan memori yang tersedia ini disebut sebagai penyimpanan gratis program. Memori penyimpanan gratis yang dialokasikan tidak bernama.

Sudipto
sumber