Standardı anladığım kadarıyla (aslında bir referansın adını veremiyor olsam da), kapsayıcı dayanağı ve bellek tahsisi iyi bir nedenden dolayı kasıtlı olarak ayrıştırıldı. Bunun için farklı, ayrı çağrılarınız var
constructor
kabın kendisini yaratmak için
reserve()
en az (!) belirli sayıda nesneyi barındırmak için uygun büyüklükte bir bellek bloğunu önceden tahsis etmek
Ve bu çok mantıklı. Var olmanın tek hakkı reserve()
, vektörü büyütürken muhtemelen pahalı yeniden tahsisler etrafında kodlama fırsatı vermektir. Faydalı olabilmeniz için, saklanacak nesnelerin sayısını bilmeniz veya en azından eğitimli bir tahminde bulunabilmeniz gerekir. Bu verilmezse reserve()
, boşa harcanan bellek için yeniden tahsisi değiştireceğinizden uzak durmanız daha iyi olur.
Yani hepsini bir araya getirirsek:
- Standart kasıtlı yok değil (bir uygulama özgü başlık altında, sabit "bir şey" ayırmak yerine en azından daha da cazip olacaktır) nesnelerin belirli sayıda bir bellek bloğu tahsis öncesi sağlayan bir yapıcı belirtin.
- Tahsis örtük olmamalıdır. Bu nedenle, bir bloğu önceden tahsis etmek için ayrı bir çağrı yapmanız gerekir
reserve()
ve bunun aynı inşaat yerinde olması gerekmez (yerleştirmek için gerekli büyüklüğün farkına vardıktan sonra tabii ki daha sonra olabilir / olmalı)
- Dolayısıyla, bir vektör her zaman uygulama tanımlı boyutta bir bellek bloğunu önceden tahsis ederse, bu amaçlanan işi engeller,
reserve()
değil mi?
- STL doğal olarak bir vektörün amaçlanan amacını ve beklenen boyutunu bilemezse, bir bloğu önceden tahsis etmenin avantajı ne olur? Ters etki yaratmasa da, oldukça saçma olacaktır.
- Bunun yerine uygun çözüm,
push_back()
önceden tarafından açıkça tahsis edilmemişse , belirli bloğu ilk ile ayırmak ve uygulamaktır reserve()
.
- Gerekli bir yeniden tahsis durumunda, blok boyutundaki artış da uygulamaya özgüdür. Bildiğim vektör uygulamaları, boyutta üssel bir artışla başlıyor, ancak büyük miktarda bellek israfını ve hatta onu patlatmayı önlemek için artış hızını belirli bir maksimumda sınırlayacak.
Tüm bunlar, yalnızca tahsis eden bir kurucu tarafından rahatsız edilmediği takdirde tam operasyon ve avantaj sağlar. reserve()
(Ve shrink_to_fit()
) tarafından talep üzerine geçersiz kılınabilen yaygın senaryolar için makul varsayılan değerleriniz var . Dolayısıyla, standart açıkça belirtmese bile, yeni inşa edilmiş bir vektörün önceden tahsis etmediğini varsaymanın mevcut tüm uygulamalar için oldukça güvenli bir bahis olduğuna oldukça eminim.