Bu "eski" soru ilginç cevaplar, hatta bazı nispeten yeni cevaplar, ama bu söz herhangi bulamadık ....
Düzgün ve özenle kullanıldığında, alloca()
küçük değişken uzunluklu ayırmaları (veya varsa C99 VLA'ları) işlemek için (belki de uygulama çapında) tutarlı kullanımı , sabit uzunluktaki büyük boyutlu yerel diziler kullanılarak, aksi takdirde eşdeğer bir uygulamaya göre daha düşük toplam yığın büyümesine yol açabilir. . Yani alloca()
olabilir destenizin için iyi dikkatlice kullanırsanız.
Bu teklifi buldum .... Tamam, bu teklifi yaptım. Ama gerçekten düşünün ....
@j_random_hacker diğer cevaplar altındaki yorumlarında çok haklı: alloca()
Büyük boyutlu yerel diziler lehine kullanmaktan kaçınmak, programınızı yığın taşmalarından daha güvenli hale getirmez (derleyiciniz, alloca()
hangi durumda kullanacağınız işlevlerin satır içine alınmasına izin verecek kadar büyük değilse) yükseltme veya alloca()
iç döngüler kullanmadığınız sürece , bu durumda ... alloca()
iç döngüler kullanmamalısınız ).
Masaüstü / sunucu ortamlarında ve gömülü sistemlerde çalıştım. Birçok gömülü sistem hiç yığın kullanmaz (destek için bağlantı bile oluşturmazlar), dinamik olarak ayrılan belleğin hiçbir zaman bir uygulamada bellek sızıntısı riski nedeniyle kötü olduğu algısını içeren nedenlerden dolayı bir seferde yıllarca yeniden başlatılır veya dinamik belleğin tehlikeli olduğu daha makul bir gerekçedir, çünkü bir uygulamanın yığınını hiçbir zaman sahte bellek tükenme noktasına parçalamayacağı kesin olarak bilinemez. Böylece gömülü programcılar birkaç alternatifle kalıyor.
alloca()
(veya VLA'lar) iş için doğru araç olabilir.
Ben bir programcı "olası herhangi bir durumda işlemek için yeterince büyük" yığın tahsisli bir tampon yapar nerede tekrar zaman gördüm. Derin iç içe bir çağrı ağacında, bu (anti -?) Paternin tekrarlı kullanımı abartılı yığın kullanımına yol açar. (20 seviyeli bir çağrı ağacının, her düzeyde farklı nedenlerle, fonksiyonun genellikle sadece 16 veya daha azını kullanacağı ve yalnızca nadir durumlarda daha fazla kullanabilirsiniz.) Bir alternatif kullanmaktıralloca()
veya VLA'lara dönüştürün ve yığının gereksiz yere yüklenmesini önlemek için yalnızca işlevinizin gerektirdiği kadar yığın alanı ayırın. Umarım çağrı ağacındaki bir işlev normalden daha büyük bir ayırmaya ihtiyaç duyduğunda, çağrı ağacındaki diğerleri normal küçük ayırmalarını kullanır ve genel uygulama yığını kullanımı her işlevin körü körüne yerel bir arabelleğe aşırı tahsis edilmesinden önemli ölçüde daha azdır. .
Ama kullanmayı seçerseniz alloca()
...
Bu sayfadaki diğer cevaplara dayanarak, VLA'ların güvenli olması gerektiği görünüyor (bir döngüden çağrıldıklarında yığın tahsislerini birleştirmiyorlar), ancak kullanıyorsanız alloca()
, bunu bir döngü içinde kullanmamaya dikkat edin ve başka bir işlevin döngüsü içinde çağırma olasılığı varsa işlevinizin satır içine alınamayacağından emin olun .