Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
Doğru ayırma yöntemini seçme
Senaryonuz için uygun bellek ayırma API'sini seçmek için aşağıdaki kılavuzu kullanın:
| Scenario | Önerilen API | Notlar |
|---|---|---|
| Genel amaçlı C++ ayırmaları | new / std::make_unique / std::make_shared |
C++ kodu için varsayılan seçenek. CRT yığınını dahili olarak kullanır. RAII otomatik temizleme sağlar. |
| Genel amaçlı C ayırmaları | malloc / calloc / realloc |
C kodu için varsayılan seçenek. Platformlar arasında taşınabilir. |
| Yaklaşık 1 MB'tan büyük ayırmalar veya sayfa düzeyinde denetim gerektiren | Virtualalloc | Sayfa ayrıntı düzeyinde (genellikle 4 KB) ayırır. Büyük adres aralıklarını, koruma sayfalarını veya belleği belirli koruma öznitelikleriyle (PAGE_READWRITE, PAGE_EXECUTE_READvb.) ayırmak için kullanın. |
| Özel denetime sahip birçok küçük ayırma (örn. havuz ayırıcı) | HeapAlloc / Yığın Oluştur | Yalıtım veya serileştirme denetimi için özel bir yığın oluşturun. Yalnızca yığın yalnızca tek iş parçacıklıysa kullanın HEAP_NO_SERIALIZE . |
| COM birlikte çalışma (sıralanmış bellek) | Cotaskmemalloc | Bellek COM daire sınırlarını aştığında gereklidir. MIDL tarafından oluşturulan saptamalar CoTaskMemAlloc/CoTaskMemFree kullanır. |
| Taşınabilir bellek kullanan eski kod | Globalalloc / Localalloc | Yeni kod kullanmaktan kaçının. Bunlar HeapAlloc'a ek yük getirir ve öncelikle pano işlemleri ve bunları gerektiren bazı Win32 API'leriyle geriye dönük uyumluluk için vardır. |
Important
Ayırma ve serbest bırakma işlevlerini her zaman doğru eşleştirin. ile HeapAlloc ayrılan bellek veya LocalFreeile değil free() ile HeapFree serbest olmalıdır. Ayırma/serbest bırakma ailelerinin karıştırılması, tanılanması zor olan yığın bozulmasına neden olur.
Note
VirtualAlloc ve HeapAlloc: VirtualAlloc, sayfa ayrıntı düzeyinde çalışır (en az 4 KB, rezervasyonlar ile hizalanmış SYSTEM_INFO.dwAllocationGranularity, genellikle 64 KB). VirtualAlloc ile birçok küçük nesnenin tahsisi adres alanını boşa harcar. Küçük ve sık ayırmalar için HeapAlloc (veya malloc/new) kullanın. Büyük adres bölgelerini ayırmanız, sayfa korumasını denetlemeniz veya özel ayırıcılar uygulamanız gerektiğinde VirtualAlloc kullanın.
Ayrıntılı karşılaştırma
Aşağıda çeşitli bellek ayırma yöntemlerinin kısa bir karşılaştırması yer alır:
- Cotaskmemalloc
- GlobalAlloc
- HeapAlloc
- Localalloc
- Malloc
- yeni
- Virtualalloc
GlobalAlloc, LocalAlloc ve HeapAlloc işlevleri sonunda aynı yığından bellek ayırsa da, her biri biraz farklı bir işlev kümesi sağlar. Örneğin , HeapAlloc'a bellek ayrılamadıysa, LocalAlloc ile kullanılamayan bir özellik için özel durum oluşturması bildirilebilir. LocalAlloc , heapAlloc ile kullanılamayan bir özellik olan tanıtıcı değerini değiştirmeden temel belleğin gerçek konum tarafından taşınmasına izin veren tanıtıcıların ayrılmasını destekler.
32 bit Windows başlayarak, GlobalAlloc ve LocalAlloc, işlemin varsayılan yığınına bir tanıtıcı kullanılarak HeapAlloc'u çağıran sarmalayıcı işlevleri olarak uygulanır. Bu nedenle , GlobalAlloc ve LocalAlloc'un yükü HeapAlloc'tan daha fazladır.
Farklı yığın ayırıcıları farklı mekanizmalar kullanarak ayırt edici işlevsellik sağladığından, belleği doğru işlevle boşaltmanız gerekir. Örneğin, HeapAlloc ile ayrılan bellek LocalFree veya GlobalFree ile değil HeapFree ile serbest bırakılmalıdır. GlobalAlloc veya LocalAlloc ile ayrılan bellek sorgulanmalı, doğrulanmalı ve ilgili genel veya yerel işlevle serbest bırakılmalıdır.
VirtualAlloc işlevi, bellek ayırma için ek seçenekler belirtmenize olanak tanır. Ancak ayırmaları bir sayfa ayrıntı düzeyi kullandığından VirtualAlloc kullanılması daha yüksek bellek kullanımına neden olabilir.
malloc işlevinin çalışma zamanına bağımlı olma dezavantajı vardır. Yeni işleç, derleyiciye bağımlı ve dile bağımlı olma dezavantajı vardır.
CoTaskMemAlloc işlevi C, C++ veya Visual Basic iyi çalışma avantajına sahiptir. MIDL, belleği sıralamak için CoTaskMemAlloc ve CoTaskMemFree kullandığından, COM tabanlı bir uygulamada belleği paylaşmanın da tek yoludur.
Örnekler
İlgili konular