SORU
11 HAZİRAN 2011, CUMARTESİ


İnş-doğruluğu derleyici optimizasyonu için daha fazla oda verir mi?

Okunabilirliği arttırır ve programın daha az hata eğilimli, ama ne kadar performansını artırmak mı? yapar biliyorum

Ve bir yan not, ne bir referans ve const bir işaretçi arasındaki en büyük fark nedir? Hafızasında farklı, ama nasıl bu kadar saklı olduklarını sanıyorum?

Teşekkürler.

CEVAP
11 HAZİRAN 2011, CUMARTESİ


[Edit: bu soru ilk başta düşündüğümden daha ince olduğunu, bu yüzden TAMAM.]

İşaretçi-sabit veya başvuru--sabit ilan hiç bir şey optimize etmek için herhangi bir derleyici yardımcı olur. (Gerçi bu cevap altındaki Güncelleştirme bölümüne bakın.)

const ilan sadece bir tanımlayıcı içinde nasıl kullanılacağını gösterirkapsambağımsızlık ilanının; alttaki nesneyi değiştiremez öyle bir şey demiyor.

Örnek:

int foo(const int *p) {
    int x = *p;
    bar(x);
    x = *p;
    return x;
}

Derleyici olamaz varsayalım *p değil değiştiren aramak için bar() çünkü p olabilir (örneğin) bir işaretçi küresel int bar() diye değiştirin.

Eğer derleyici kanıtlamak foo() arayan ve bar() içeriği hakkında yeterince bilir bar() *p, sonra da değiştirmezayrıca sabit bildirimi olmadan kanıtı gerçekleştirebilirsiniz.

Ama bu genel olarak doğrudur. Çünkü const yalnızca etkiliyor kapsamında beyannamesi, derleyici zaten bakın nasıl tedavi işaretçi veya başvuru içinde bu kapsam; bunu zaten bildiğinden değil değiştirme temel nesne.

Yani Kısacası, const Bu bağlamda yaptığı hatalar yapmasını engeller. Zaten bilmez, söylemez, ve bu nedenle optimizasyon için önemsiz.

Ne foo() arama işlevleri hakkında? Gibi:

int x = 37;
foo(&x);
printf("%d\n", x);

Derleyici bu foo() aldığından 37, parmak izi kanıtlamak 20**?

Hayır. foo()-sabit işaretçi alır olsa da, sabit-ness uzağa fırlatmak ve int değişiklik olabilir. (Budeğiltanımsız davranış.) Burada yine, derleyici olamaz genel olarak herhangi bir varsayım yapmak; ve eğer foo() böyle bir iyileştirme yapmak için yeterince biliyorsa, bile const olmadan bunu biliyor.

const en iyi duruma getirme olanağı verebilecek tek zaman bu gibi durumlarda

const int x = 37;
foo(&x);
printf("%d\n", x);

Burada, herhangi bir mekanizma ne olursa olsun (örneğin, bir işaretçi alarak ve const cast away) ile x değiştirmek için Tanımsız Davranış çağırmak için. Derleyici bunu yok farz etmek ücretsiz ve basit bir beşgen kullanmaktır içine sürekli 37 yaymak böylece). Optimizasyon bu tür const bildirdiğiniz herhangi bir nesne için yasaldır. (Pratikte, hiç bir başvuru kabul yerel bir değişken derleyici zaten kendi kapsamında değişiklik olup olmadığını görmek için bir faydası olmaz.)

Sizin "not" soru, (a) sabit bir işaretçi bir işaretçi; ve (b) sabit bir işaretçi NULL. eşit yan cevap İç temsil (yani adresi) büyük olasılıkla aynı olduğu doğru.

[güncelleme]

Christoph yorum işaret ettiği gibi, benim cevap restrict söz etmez, çünkü tamamlanmadı.

Diyor ki: C99 standardının bölüm 6.7.3.1 (4)

B her yürütülürken, L ise L İse &P. dayanarak L olan herhangi bir lvalue olsun atayan, ve X de (herhangi bir şekilde) değişiklik nesnenin X,erişim değeri aşağıdaki gereksinimler geçerlidir: T sabit nitelikli olmayacaktır. ...

(Burada B olan R-E-S-pointer-to-T kısıtlamak, kapsamında temel taşıdır.)

C fonksiyon foo() böyle ilan etti:

foo(const int * restrict p)

...sonra derleyiciolabilir*p hiçbir değişiklik aksi Davranışı Tanımsız olur çünkü foo() -- yürütme sırasında p -- yani, ömrü boyunca meydana varsayalım.

Bu yüzden prensip olarak, işaretçi-için-sabit olan restrict birleştirerek yukarıda ilişiği kesilir ve en iyi duruma getirme hem de sağlayabilir. Herhangi bir derleyicileri aslında böyle bir iyileştirme, acaba hayata? (4.5.2, en azından, değil GCC.)

restrict sadece C, C, C 0 x), derleyici özgü bir uzantısı olarak dışında değil içinde bulunduğunu unutmayın.

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Dylan Brenan

    Dylan Brenan

    22 Aralık 2009
  • efaustus9

    efaustus9

    16 HAZİRAN 2006
  • Yo Mama

    Yo Mama

    18 EYLÜL 2005