Membandingkan Metode Alokasi Memori

Memilih metode alokasi yang tepat

Gunakan panduan berikut untuk memilih API alokasi memori yang sesuai untuk skenario Anda:

Skenario API yang direkomendasikan Notes
Alokasi C++ tujuan umum new / std::make_unique / std::make_shared Pilihan default untuk kode C++. Menggunakan timbunan CRT secara internal. RAII memastikan pembersihan otomatis.
Alokasi C tujuan umum malloc / calloc / realloc Pilihan default untuk kode C. Portabel di seluruh platform.
Alokasi lebih besar dari ~1 MB atau membutuhkan kontrol tingkat halaman VirtualAlloc Mengalokasikan pada granularitas halaman (biasanya 4 KB). Gunakan untuk menservasi rentang alamat besar, halaman penjaga, atau memori dengan atribut perlindungan tertentu (PAGE_READWRITE, , PAGE_EXECUTE_READdll.).
Banyak alokasi kecil dengan kontrol kustom (misalnya, alokator kumpulan) HeapAlloc / HeapCreate Buat tumpukan privat untuk kontrol isolasi atau serialisasi. Gunakan HEAP_NO_SERIALIZE hanya jika timbunan secara eksklusif berulir tunggal.
Interop COM (memori marshaled) CoTaskMemAlloc Diperlukan saat memori melewati batas apartemen COM. Stub yang dihasilkan MIDL menggunakan CoTaskMemAlloc/CoTaskMemFree.
Kode warisan menggunakan memori yang dapat dipindahkan GlobalAlloc / LocalAlloc Hindari kode baru. Ini menambahkan overhead di atas HeapAlloc dan terutama ada untuk kompatibilitas mundur dengan operasi clipboard dan API Win32 tertentu yang memerlukannya.

Important

Selalu pasangkan fungsi alokasi dan dealokasi dengan benar. Memori yang dialokasikan dengan HeapAlloc harus dibebaskan dengan HeapFree — bukan free() atau LocalFree. Mencampur keluarga alokasi/dealokasi menyebabkan kerusakan timbunan yang sulit didiagnosis.

Note

VirtualAlloc vs HeapAlloc: VirtualAlloc beroperasi pada granularitas halaman (minimum 4 KB, reservasi yang selaras dengan SYSTEM_INFO.dwAllocationGranularity, biasanya 64 KB). Mengalokasikan banyak objek kecil dengan ruang alamat limbah VirtualAlloc. Gunakan HeapAlloc (atau malloc/new) untuk alokasi kecil dan sering. Gunakan VirtualAlloc saat Anda perlu memesan wilayah alamat besar, mengontrol perlindungan halaman, atau menerapkan alokator kustom.

Perbandingan terperinci

Berikut ini adalah perbandingan singkat dari berbagai metode alokasi memori:

Meskipun fungsi GlobalAlloc, LocalAlloc, dan HeapAlloc pada akhirnya mengalokasikan memori dari tumpukan yang sama, masing-masing menyediakan serangkaian fungsionalitas yang sedikit berbeda. Misalnya, HeapAlloc dapat diinstruksikan untuk menaikkan pengecualian jika memori tidak dapat dialokasikan, kemampuan yang tidak tersedia dengan LocalAlloc. LocalAlloc mendukung alokasi handel yang memungkinkan memori yang mendasar dipindahkan oleh realokasi tanpa mengubah nilai handel, kemampuan yang tidak tersedia dengan HeapAlloc.

Dimulai dengan Windows 32-bit, GlobalAlloc dan LocalAlloc diimplementasikan sebagai fungsi pembungkus yang memanggil HeapAlloc menggunakan handel ke tumpukan default proses. Oleh karena itu, GlobalAlloc dan LocalAlloc memiliki overhead yang lebih besar daripada HeapAlloc.

Karena alokator timbunan yang berbeda menyediakan fungsionalitas yang khas dengan menggunakan mekanisme yang berbeda, Anda harus membebaskan memori dengan fungsi yang benar. Misalnya, memori yang dialokasikan dengan HeapAlloc harus dibebaskan dengan HeapFree dan bukan LocalFree atau GlobalFree. Memori yang dialokasikan dengan GlobalAlloc atau LocalAlloc harus dikueri, divalidasi, dan dirilis dengan fungsi global atau lokal yang sesuai.

Fungsi VirtualAlloc memungkinkan Anda menentukan opsi tambahan untuk alokasi memori. Namun, alokasinya menggunakan granularitas halaman, sehingga menggunakan VirtualAlloc dapat mengakibatkan penggunaan memori yang lebih tinggi.

Fungsi malloc memiliki kerugian karena bergantung pada run-time. Operator baru memiliki kerugian menjadi dependen kompilator dan dependen bahasa.

Fungsi CoTaskMemAlloc memiliki keuntungan bekerja dengan baik di C, C++, atau Visual Basic. Ini juga satu-satunya cara untuk berbagi memori dalam aplikasi berbasis COM, karena MIDL menggunakan CoTaskMemAlloc dan CoTaskMemFree ke memori marshal.

Examples

Fungsi Global dan Lokal

Fungsi Timbunan

Fungsi Memori Virtual