2012-09-22 23 views
9

standardı bu hat ile argümanlar değerlendirilmesi sırasını belirtmez: argümanların değerlendirmeninNeden C++ cinsinden belirtilmemiş işlev parametreleri için değerlendirme sırasıdır?

düzen belirtilmemiş olduğunu.

ima ifade değerlendirme amacıyla kısıtlamalar olmadan

Daha iyi kod oluşturulabilir diyor?

Tüm derleyicilerin örneğin Soldan Sağa işlev argümanlarını değerlendirmesini istemekle ilgili dezavantaj nedir? Bu belirtilmemiş özelliklerden dolayı derleyici ne tür optimizasyon yapar?

+4

Derleyicinin işlenenlerin değerlendirmesini yeniden sıralamasına izin vermek, en iyileştirme için daha fazla yer ekler. – Mysticial

+1

@Mysticial: Absurd göründüğü gibi, bu bir cevap olmalı ve aslında * kabul edildi * cevap! –

+0

Derleyiciler ne tür optimizasyon yapar? – unj2

cevap

25

Derleyicinin işlenenlerin değerlendirmesini yeniden sıralamasına izin vermek, en iyileştirme için daha fazla yer ekler.

Örnekleme amacıyla tamamen oluşturulmuş bir örnek.

işlemci olabilir varsayalım:

  • Sayı 1 talimat her döngü.
  • 1 döngüde bir ek yürütme.
  • 3 döngüde bir çoğaltma gerçekleştirin.
  • Eklemeleri ve çarpımları aynı anda yürütebilir. Eğer bir işlemci üzerinde bu sol sağa yürütmek için olsaydı

    foo(a += 1, b += 2, c += 3, d *= 10); 
    

    OOE olmadan:

    Cycle - Operation 
    0  - a += 1 
    1  - b += 2 
    2  - c += 3 
    3  - d *= 10 
    4  - d *= 10 
    5  - d *= 10 
    

    Şimdi eğer

Şimdi aşağıdaki gibi bir işlev çağrısı olduğunu varsayalım Derleyicinin bunları yeniden sıralamasına izin ver: (ve önce çarpmayı başlat)

Cycle - Operation 
0  - d *= 10 
1  - a += 1, d *= 10 
2  - b += 2, d *= 10 
3  - c += 3 

Yani 6 döngü vs 4 döngü. Yine bu tamamen zorakidir. Modern işlemciler bundan daha karmaşıktır. Ama fikri anladın.

1

İşte basit bir örnek.

// assume that p is a pointer to an integer 
foo(*p * 3, bar(), *p * 3 + 1); 

derleyici iki kez dereference p gerekiyor (ve sonucuna dayanarak bazı hesaplamalar yapmak) ve bir kez bar çağrı: aşağıdaki gibi bir işlev çağrısı olduğunu varsayalım. derleyici zeki ise,

int temp = *p * 3; 
foo(temp, bar(), temp + 1); 

yalnızca bir kez "3 ile çarpın, dereference" yapması gereken Bu şekilde değerlendirmenin yeniden düzenlemek olabilir. Bu ortak alt-ifade eliminasyonu olarak bilinir.

+1

Adil olmak gerekirse, değerlendirme sırasını garanti eden diller bile, p'nın değerinin aralarında değişemeyeceğini ispat edebilmeleri koşuluyla bunu yapabilirler. Elbette, C bellek modeli ile garanti edilmesi neredeyse imkansızdır, bu da muhtemelen bu optimizasyonu elde etmek için tanımlanmamış değerlendirme sırasının niçin gerekli olduğudur. – Joey

İlgili konular