Aracılığıyla paylaş


Yığın İşlevleri

Her işlem, sistem tarafından sağlanan varsayılan bir yığına sahiptir. Yığından sık sık ayırmalar oluşturan uygulamalar, özel yığınlar kullanarak performansı artırabilir.

Özel yığın, arama işleminin adres alanında bir veya daha fazla sayfanın bloğudur. Özel yığını oluşturduktan sonra işlem, o yığındaki belleği yönetmek için HeapAlloc ve HeapFree gibi işlevleri kullanır.

Yığın işlevleri, GetProcessHeap işlevi tarafından döndürülen tanıtıcı kullanılarak işlemin varsayılan yığınındaki belleği yönetmek için de kullanılabilir. Yeni uygulamalar bu amaçla genel ve yerel işlevler yerine yığın işlevlerini kullanmalıdır.

Özel bir yığından ayrılan bellek ile diğer bellek ayırma işlevleri kullanılarak ayrılan bellek arasında fark yoktur. İşlevlerin tam listesi için Bellek Yönetimi İşlevleri'ndeki tabloya bakın.

Not

bir iş parçacığı, yalnızca GetProcessHeap veya HeapCreate işlevi tarafından döndürülen tanıtıcıları kullanarak, iş parçacığının oluşturduğu ve yönettiği varsayılan yığın ve özel yığınlar için yığın işlevlerini çağırmalıdır.

 

HeapCreate işlevi, çağırma işleminin HeapAlloc işlevini kullanarak bellek bloklarını ayırabileceği özel bir yığın nesnesi oluşturur. YığınOluştur hem başlangıç boyutunu hem de yığın için en büyük boyutu belirtir. İlk boyut, yığın için başlangıçta ayrılan işlenen, okuma/yazma sayfalarının sayısını belirler. Maksimum boyut, ayrılmış sayfaların toplam sayısını belirler. Bu sayfalar, yığının büyüyebileceği bir işlemin sanal adres alanında bitişik bir blok oluşturur. HeapAlloc tarafından yapılan istekler fiziksel depolama alanının kullanılabilir olduğu varsayılarak, işlenen sayfaların geçerli boyutunu aşarsa ek sayfalar bu ayrılmış alandan otomatik olarak işlenir. Sayfalar işlendikten sonra, işlem sonlandırılana kadar veya HeapDestroy işlevi çağrılarak yığın yok edilene kadar ayrıştırılmazlar.

Özel yığın nesnesinin belleğine yalnızca onu oluşturan işlem erişebilir. Dinamik bağlantı kitaplığı (DLL) özel bir yığın oluşturursa, bunu DLL'yi çağıran işlemin adres alanında yapar. Yalnızca bu işlem için erişilebilir.

HeapAlloc işlevi özel bir yığından belirtilen sayıda bayt ayırır ve ayrılan bloğun işaretçisini döndürür. Bu işaretçi, HeapFree, HeapReAlloc, HeapSizeve HeapValidate işlevlerinde kullanılabilir.

HeapAlloc tarafından ayrılan bellek taşınamaz. HeapAlloc tarafından döndürülen adres, bellek bloğu serbest bırakılana veya yeniden ayrılana kadar geçerlidir; bellek bloğunun kilitlenmesi gerekmez.

Sistem özel bir yığını sıkıştıramadığından parçalanabilir. Çeşitli ayırma boyutlarında büyük miktarda bellek ayıran uygulamalar, yığın parçalanmayı azaltmak için düşük parçalanma yığını kullanabilir.

Yığın işlevleri için olası bir kullanım, bir işlem başladığında özel bir yığın oluşturmak ve işlemin bellek gereksinimlerini karşılamak için yeterli bir başlangıç boyutu belirtmektir. HeapCreate işlevine yapılan çağrı başarısız olursa işlem sonlandırabilir veya kullanıcıya bellek yetersizlik durumunu bildirebilir; ancak başarılı olursa, işlem gereken belleğe sahip olduğundan emin olur.

HeapCreate tarafından istenen bellek bitişik olabilir veya olmayabilir. HeapAlloc tarafından bir yığın içinde ayrılan bellek bitişiktir. HeapAlloctarafından ayrılanlar dışında bir yığındaki belleğe yazmamalı veya bellekten okumamalısınız; HeapAlloctarafından ayrılan iki bellek alanı arasındaki ilişkiyi de varsaymamalısınız.

HeapFreetarafından serbest bırakılmış olan belleğe herhangi bir şekilde başvurmamalısınız. Bellek boşaltıldıktan sonra, içinde olabilecek tüm bilgiler sonsuza kadar kaybolur. Bilgiye ihtiyacınız varsa, bilgileri içeren belleği boşaltmayın. Bellek hakkında bilgi döndüren işlev çağrıları (HeapSizegibi) boş bellekle kullanılamaz, bu nedenle sahte veriler döndürebilirler.

HeapDestroy işlevi özel bir yığın nesnesini yok eder. Yığın nesnesinin tüm sayfalarının komutlarını alır ve serbest bırakır ve tanıtıcıyı yığına geçersiz kılır.

Bellek Ayırma Yöntemlerini Karşılaştırma