Bellek parçalanması, disk parçalanmasıyla aynı kavramdır: kullanılan alanlara atıfta bulunur, çünkü kullanımdaki alanlar birbirine yeterince yakın değildir.
Basit bir oyuncak örneği için on bayt belleğiniz olduğunu varsayalım:
| | | | | | | | | | |
0 1 2 3 4 5 6 7 8 9
Şimdi üç üç baytlık blok atayalım: A, B ve C:
| A | A | A | B | B | B | C | C | C | |
0 1 2 3 4 5 6 7 8 9
Şimdi B bloğunu yeniden konumlandırın:
| A | A | A | | | | C | C | C | |
0 1 2 3 4 5 6 7 8 9
Şimdi dört baytlık bir D bloğu tahsis etmeye çalışırsak ne olur? Peki, dört bayt bellekte boş yer var, ancak dört bitişik bayt belleğimiz yok, bu yüzden D'yi ayıramayız! Bu, hafızanın verimsiz kullanımıdır, çünkü D'yi depolayabilmeliydik, ancak yapamadık. C'yi yer açmak için hareket ettiremeyiz, çünkü programımızdaki bazı değişkenler C'yi işaret ediyor ve tüm bu değerleri otomatik olarak bulamıyor ve değiştiremiyoruz.
Bunun bir sorun olduğunu nereden biliyorsun? En büyük işaret, programınızın sanal bellek boyutunun gerçekte kullandığınız bellek miktarından çok daha büyük olmasıdır. Gerçek dünyadaki bir örnekte, on bayttan fazla belleğiniz olur, bu nedenle D sadece bir bayt 9 başlayarak tahsis edilir ve daha sonra üç bayt uzunluğunda veya daha küçük bir şey ayırmazsanız, bayt 3-5 kullanılmaz.
Bu örnekte, 3 bayt boşa harcanacak çok şey değildir, ancak iki baytlık iki ayırmanın örneğin bellekte on megabayt olduğu ve 10 megabayt boyutunda bir blok tahsis etmeniz gereken daha patolojik bir durumu düşünün. + 1 bayt. Yeterli alana sahip olmanın sadece bir baytlık olmasına rağmen, işletim sisteminden bunu yapmak için on megabayttan fazla sanal bellek istemeniz gerekiyor.
Nasıl önlersiniz? En kötü durumlar, sık sık küçük nesneler oluşturduğunuzda ve yok ettiğinizde ortaya çıkma eğilimindedir, çünkü bu, birçok küçük delikle ayrılmış birçok küçük nesne ile "İsviçre peyniri" etkisi oluşturma eğilimindedir ve bu deliklere daha büyük nesneler tahsis etmeyi imkansız hale getirir. Bunu yapacağınızı bildiğinizde, etkili bir strateji, küçük nesneleriniz için büyük bir bellek bloğunu havuz olarak önceden ayırmak ve daha sonra izin vermek yerine bu blok içindeki küçük nesnelerin oluşturulmasını manuel olarak yönetmektir. varsayılan ayırıcı işlemek.
Genel olarak, ne kadar az ayırma yaparsanız, bellek parçalanma olasılığı o kadar az olur. Bununla birlikte, STL bununla oldukça etkili bir şekilde ilgilenir. Geçerli tahsisatının tamamını kullanan bir dizeniz varsa ve bu karaktere bir karakter eklerseniz, geçerli uzunluğuna ve bir tanesine yeniden tahsis edilmez , uzunluğunu iki katına çıkarır . Bu, "sık küçük tahsisat havuzu" stratejisinin bir varyasyonudur. Dize, tekrarlanan küçük yeniden tahsisler yapmadan boyutta tekrarlanan küçük artışlarla etkili bir şekilde başa çıkabilmesi için büyük bir bellek yığınını yakalar. Tüm STL kapları aslında bu tür bir şey yapar, bu nedenle genellikle otomatik olarak yeniden tahsis edilen STL kaplarının neden olduğu parçalanma hakkında çok fazla endişelenmenize gerek yoktur.
Tabii ki STL kapları bellekleri birbirleri arasında biriktirmese de, çok sayıda küçük kap (sık sık yeniden boyutlandırılan birkaç kap yerine) oluşturacaksanız, aynı şekilde parçalanmayı önleme konusunda kendinizi endişelendirmeniz gerekebilir. herhangi bir sık oluşturulan küçük nesneler için, STL veya değil.