SORU
11 Aralık 2009, Cuma


C değişken uzunlukta diziler ?

Çok fazla C son birkaç yıldır kullanmadım. this soru bugün okuduğumda aşina değildim C Bazı sözdizimi rastladım.

Görünüşe göre C99 aşağıdaki sözdizimi geçerli:

void foo(int n) {
    int values[n]; //Declare a variable length array
}

Bu oldukça yararlı bir özellik gibi görünüyor. Kimse C standart ekleme ile ilgili bir tartışma vardı, ve eğer öyleyse, neden atlanmış olduğunu biliyor mu? Bazı olası nedenler:

  • Derleyici satıcıları için kıllı uygulamak
  • Standart bazı diğer bölümü ile uyumsuz
  • İşlevselliği diğer C yapıları ile taklit edilebilir
  • ???

C standart dizi boyutu sabit bir ifade (8.3.4.1) olması gerektiğini belirtir

Evet, tabii ki oyuncak örnekte bir std::vector<int> values(m); kullanabilir farkındayım ama bu öbek ve yığın bellek ayırır. Ve eğer çok boyutlu bir dizi mesela benim gibi:

void foo(int x, int y, int z) {
    int values[x][y][z]; //Declare a variable length array
}

vector sürümü çok hantal olur

void foo(int x, int y, int z) {
    vector< vector< vector<int> > > values(/*really painful expression here*/);
}

Dilimleri, satırlar ve sütunlar aynı zamanda potansiyel bellek geneline yayılmış olacak.

EDİT: comp.std.c tartışma bu soru tartışma her iki tarafında. çok ağır bazı isimlerle oldukça tartışmalı olduğu açıktır Arıyorum std::vector her zaman daha iyi bir çözüm olduğunu kesinlikle belli değil.

CEVAP
11 Aralık 2009, Cuma


Son zamanlarda bu usenet başladı hakkında bir tartışma vardı: Why no VLAs in C 0x.

Genellikle sadece küçük bir boşluk mevcut olan yığın, Olası büyük bir dizi oluşturmak zorunda iyi olmadığını kabul gözüken bu insanlara katılıyorum. Bu argüman, eğer boyutunu önceden biliyorsanız, statik bir dizi kullanabilirsiniz. Ve eğer boyutunu bilmiyorum ama önceden, güvenli olmayan kod yazacaksınız.

C99 VLAs olabilir sağlar küçük bir fayda oluşturabilir küçük diziler olmadan israf alanı veya çağrı kurucular için kullanılmayan öğeleri, ama onlar oldukça büyük değişiklikler tanıtmak için bu tür sistemi (ihtiyacınız yapabilmek için belirtmek türleri bağlı olarak çalışma zamanı değerleri bu değil henüz mevcut geçerli C , hariç için new operatör tipi belirteçleri, ama onlar özel olarak ele alınır, böylece çalışma zamanı-lik yok kaçış kapsamı new operatör).

Kullanabilirsiniz std::vector, ama öyle değil eskisi gibi kullanır dinamik hafıza, yapma, hem de kendi yığın ayırıcı değil tam olarak kolay uyum sorununu da). Ayrıca, bir vektör VLAs boyutu sabit ise, yeniden boyutlandırılabilir bir kapsayıcı, çünkü aynı sorun çözmek değil. C Dynamic Array teklif kitaplığı tabanlı bir çözüm, bir dil VLA dayalı olarak alternatif tanıtmak için tasarlanmıştır. Ancak, C 0, bildiğim kadarıyla bir parçası olacak.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • BMG Rentals Property Management

    BMG Rentals

    23 Mayıs 2011
  • SRI International

    SRI Internat

    30 NİSAN 2008
  • Thom Hall

    Thom Hall

    24 Kasım 2006