Bu soru so so dondurucu bir resepsiyon var, bu yüzden orada silmek ve bunun yerine burada deneyin karar verdi. Buraya da uygun olmadığını düşünüyorsanız, lütfen en azından peşinde olduğum bir örneği nasıl bulacağınıza dair bir yorum bırakın ...
C99 VLA'ları kullanmanın, mevcut standart yığın kullanan C ++ RAII mekanizmalarına göre gerçek bir avantaj sunduğu bir örnek verebilir misiniz ?
Sonra olduğum örnek:
- Yığın kullanımına göre kolayca ölçülebilir (% 10 belki) bir performans avantajı elde edin.
- Tüm diziye hiç ihtiyaç duymayacak iyi bir geçici çözüm yoktur.
- Aslında sabit maksimum boyut yerine dinamik boyuttan yararlanın.
- Normal kullanım senaryosunda yığın taşmasına neden olma olasılığı düşüktür.
- Bir C ++ projesine bir C99 kaynak dosyası eklemek için performansa ihtiyaç duyan bir geliştiriciyi cezbedecek kadar güçlü olun.
Bağlam hakkında bazı açıklamalar ekleyerek: C99 ile kastedilen ve standart C ++ 'da yer almayan VLA'yı kastediyorum: int array[n]
burada n
bir değişkendir. Ve ben diğer standartlar (C90, C ++ 11) tarafından sunulan alternatifler koyar kullanım örneği bir örnek sonra:
int array[MAXSIZE]; // C stack array with compile time constant size
int *array = calloc(n, sizeof int); // C heap array with manual free
int *array = new int[n]; // C++ heap array with manual delete
std::unique_ptr<int[]> array(new int[n]); // C++ heap array with RAII
std::vector<int> array(n); // STL container with preallocated size
Bazı fikirler:
- Doğal olarak öğe sayımını makul bir şeyle sınırlayan varargs alan işlevler, herhangi bir yararlı API düzeyinde üst sınır içermez.
- Atık israfının istenmeyen olduğu özyinelemeli fonksiyonlar
- Yığın yükünün kötü olacağı birçok küçük tahsis ve sürüm.
- Performansın kritik olduğu ve küçük işlevlerin çok fazla satır içi olması beklenen çok boyutlu dizileri (rastgele boyutlandırılmış matrisler gibi) ele almak.
- Yorumdan: yığın tahsisinin senkronizasyon yükü olduğu eşzamanlı algoritma .
Wikipedia'nın kriterlerimi karşılamayan bir örneği var , çünkü öbek kullanmanın pratik farkı en azından bağlamsız olarak ilgisiz görünüyor. Ayrıca ideal değildir, çünkü daha fazla bağlam olmadan, öğe sayısı çok iyi yığın taşmasına neden olabilir gibi görünüyor.
Not: Özellikle bir örnek kod veya bundan yarar sağlayacak bir algoritma önerisi sonrasında, örneği kendim uygulamak için kullanıyorum.
alloca
temelde aynı şey olduğunu düşündüğüm C99 VLA veya aslında herhangi bir standart değil ). Ama bu çok iş parçacıklı şey, onu dahil etmek için soru düzenleme iyi!
malloc
davranışının C standardına uyup uymadığı tartışmalıdır .
alloca()
de çokmalloc()
iş parçacıklı bir ortamda gerçekten gölgede kalır . Ancak bu, küçük dizilerin yalnızca sabit bir boyut kullanması gerektiği için büyük bir dizidir ve büyük dizilerin muhtemelen yığınlara ihtiyacı olacaktır.