İ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
[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.
Django nasıl bir görünüm içinde 2 ya d...
Doğrulama, bir veya daha fazla varlıkl...
Doğrulama Sunucu Veritabanı Varlık Çer...
Hata mesaj 'istenen türde bir vey...
Bir veya daha fazla türde bulunamıyor ...