Öğrencilerime alloca öğretmeli miyim? [kapalı]


18

allocaGerçek dünyada ne kadar yaygın kullanılır ? Öğrencilerime allocaanlamlı olduğunda kullanmayı öğretmeli miyim ? Yoksa onlara asla kullanmamasını mı öğretmeliyim? Bir C ++ RAII arka planından geliyorsa free, özellikle birden fazla çıkış noktası olan işlevlerde manuel olarak çağrı yapmak zorunda kalma fikri umut verici geliyor.



8
Neden onlara C99 VLA'ları öğretmiyorsunuz?

@cnicutar alloca () uygulamaya bağlıdır, ancak en azından birçok uygulama hata durumunda NULL döndürür. C99 VLA'ların başarısızlığı göstermenin bir yolu yoktur.
Karmaşık bkz. Bio

2
@sbi: SO için bu, yakınların SO gönderilerinin olması gerektiğini düşündüğü biçime gerçekten uymayan açık uçlu bir sorudur. Çok öznel, açık bir cevap yok, sadece fikir. Hangi iyi ama SO için değil. Ayrıca OP'nin temsilcisine saygı duyulmasının hiç kimsenin oy kullanmadığına dikkat edin, bu konuyu konu dışı olarak kapatıyoruz.
Paul Sasik

1
@PascalCuoq Zaten alloca / VLA'lara çok fazla tahsis etmemelisiniz. Geçerli bağlamda "çok" un ne olduğundan emin değilseniz kullanın malloc.

Yanıtlar:


31

Genel olarak C programlamasında bir kurs tutuyorsanız, onlara standartta olmayan bir şey öğretmemelisiniz . Bu şekilde öğretildikleri için standart olmayan ve / veya taşınabilir olmayan kod yazmalarına gerek kalmadan yeni başlayan programcılar, son 20-30 yıl boyunca yazılım endüstrisi için büyük bir sorun olmuştur. Onlara standardı öğretmeme maliyeti ve standarttan başka hiçbir şey astronomiktir.

Algoritmalar veya uygulama programlama konusunda daha gelişmiş bir kurs tutuyorsanız, bundan bahsetmek iyi olabilir. Öte yandan, zor gerçek zamanlı gömülü uygulamalardan Windows uygulama havasına kadar her şeyi 15 yıldır bu işlevi kullanmadan programladım.


Başka bir yolun daha iyi yapılmayacağı yerde gördüğüm tek kullanım, bazı Windows sürümlerinde yığın smash algılama yapmaktı, burada alloca başarısızlığı yetersiz alan kaldığını gösterdi - ya da belki de çökmeyi yakalamak için bazı gnarly ASM vardı ; Bu koda baktığımdan beri biraz zaman geçti. İşe yaradı, ama biraz dehşetti.
Donal Fellows

13

İki şey olduğunu görebiliyorum:

  1. Öğrenciler etkisini anlar, allocayığın ve yığın arasındaki farkları okur ve allocadikkatli kullanırlar . (olası olmayan)

  2. Öğrenciler, "vay canına, bu mallocendişe etmeden bir şey gibi" diye düşünüyor, freeaşırı derecede kullanıyor, yığın taşması oluyor ve ne olduğunu bilmiyorlar.

Ben açıklamak alloca, daha sonra bu kodu çalıştırmak çok daha iyi olduğunu düşünüyorum :

#include <malloc.h>

int OverflowMyStack(int start) {
    if (start == 0)
        return 0;

    char * p = (char *)_alloca(4096);
    *p = '0';
    return OverflowMyStack(start - 1);
}

int main () {
    return OverflowMyStack(512);
} 

Kaynak: http://www.strchr.com/alloca

onlara tehlikeleri gösterin ve kullanmamalarını söyleyin. Hala yığın ve yığın hakkında bilgi edinecek, tehlikeleri işleyecek ve standart şeylerle devam edebilecekler.


1
Sanırım çoğu öğrenci, örnek kodu gösterdikten sonra bile ikinci kategoriye giriyor.
sağda

@WTP - Muhtemelen, bu yüzden onlara neler olabileceğini gösterdikten sonra bile kullanmamalarını söylüyorsunuz.
BlackJack

4
Neden bu kod kullanıyor _allocayerine alloca? Ve neden sonucu veriyor?
Keith Thompson

5

Bu sorunun cevabı, öncelikle hedeflerinizin ne olduğuna dayanmalıdır .

C yazmayı ve vahşi doğada mevcut C koduyla nasıl çalışacağını zaten programlamayı bilen birine öğretmek ister misiniz? Eğer öyleyse, alloca ve istediğiniz herhangi bir şey hakkında bilgi verin.

Öte yandan, C'yi sadece tesadüfle kullanan bir tanıtım dersi veriyorsanız (ve C çok küçük bir dil ve benzeri olduğu için) önemli bölümlere (modüler programlar, alt programlar, koleksiyonlar, vb.) Odaklanmalısınız. .). Bir öğrencinin bakış açısından, çoğu durumda malloc yeterli olduğundan ve alloca bir gereksizdir ve iyi bir kod perspektifinden, manuel bellek yönetiminin nasıl can sıkıcı olduğunu ve diğer dillerin bu sorunla nasıl başa çıktığını açık bir şekilde belirtmeniz daha iyidir. bellek yönetimi için şeyler sonra alloca veya RAII, bu yüzden gerçekten kendinizi bunlarla kısıtlamamalısınız ve daha önce de belirtildiği gibi, alloca'nın amacını diğer dillerde başka şeyler yapmak için "daha standart" yollarla karşılaştırırsanız çok daha kolay (veya C99 ...)


2

Hayır.

Bir C programcısının alloca'nın varlığından bile haberdar olması gereken tek neden, onu kullanan eski kodu anlamak ve düzeltmektir.

Herhangi bir kullanımı allocaya

  1. İşe yaramaz, yani önemsiz bir şekilde, otomatik depolama süresinin sabit boyutlu değişkenleri ile değiştirilebilir, VEYA
  2. Tehlikeli bir yığın taşması olmasını bekliyor.

Daha önce hiçbir gerçek dünya örneği bulamadığım birkaç düşünce denemesinin yanı sıra, alloca(veya VLA'lar) için işe yaramaz veya savunmasız olmayan (yukarıdaki 2 durumdan biri) bir kullanım durumu yoktur.


2
Tabii ki, kesinlikle hiç kimse bunu sorumlu bir şekilde kullanamazdı. Hayır asla.
DeadMG

Tek "sorumlu" kullanımı, allocsabit boyutlu otomatik dizilere% 100 eşdeğerdir ve daha az taşınabilirdir.
R .. GitHub BUZA YARDIMCI DURDUR

Sanırım, hiç kimse kimsenin asla taşmayacak birkaç kilobayt gibi dinamik bir miktar tahsis etmek istemeyecektir. Veya onlara ne kadar kullanılabilir olduğunu söyleyen bir OS API işlevi çağırın. Veya yığın boyutunu çok arttırın.
DeadMG

Birkaç KB ise ve birkaç KB'ye sahip olduğunuzdan eminseniz, bunu kullanabilirsiniz T foo[5000];.
R .. GitHub BUZA YARDIMCI DURDUR

Sadece T'nin önemsiz bir varsayılan yapıcısı varsa. Performansa ihtiyaç duyduysam, basit bellek sıfırlaması bile bana mal olabilir. Ancak diğer türler daha karmaşık varsayılan inşaat mantığına sahip olabilir. Örneğin, dinamik olarak bir dizi oluşturmak std::mutexistersem, beş bin muteks için bir çekirdek çağrısı ve bağlam anahtarı çağırabilirim. Ucuz değil. Diziden sonra yerel değişkenleri yerleştirmenin ek önbellek maliyetinden bahsetmiyoruz.
DeadMG

1

Benim düşüncem, yerel değişkenler için yığın alanı ayırmak için kullanılan düşük seviyeli derleyici ilkelerini öğretmediğiniz sürece, onu kullanmayı teşvik etmeyin. Bu bağlamda öğretin.


0

GCC belgeleri üzerinde birkaç pratik artıları ve eksileri vardır alloca(). Pratik bir bakış açısından, iyi miktarda özgür yazılım onu ​​kullanır, bu yüzden nasıl çalıştığını ve mevcut kodda nerede kullanıldığını anlamak iyi olur.

Geçme -Wl,-stack=yeni yığın boyutu gcc artar maksimum yığın büyüklüğü; projeniz alloca()büyük bir geçici dizi kullanıyorsa veya belirli bir bağlama bağlı derinliği aşan özyineleme kullanıyorsa bunu yapmanız gerekir .

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.