2013-07-07 10 views
6

Aşağıdaki kodu Verilen? kesin olarak bilmekOptimize Ediciler, POD olmayan geçici türleri döngüden çıkarır mı?</p> <pre><code>while(is_running) { std::vector<buffer> buffers; // fill buffers // use buffers } </code></pre> <p>Modern derleyiciler şu dönüşümü gerçekleştirmek mu:

std::vector<bufer> buffers; 

while(is_running) 
{ 
    // fill buffers 

    // use buffers 

    buffers.clear(); 
} 
+0

Neden ikincisinin daha verimli olacağını düşünüyorsunuz? Profil mi yaptın –

+1

@LuchianGrigore Düşünebilmemin tek nedeni, ilk sürümün döngü döngüsü başına bir ayırma/ayırma hakkına sahip olması, ikincisi de zorunlu olarak değil. – juanchopanza

+0

@juanchopanza: Doğru, ikincisi her döngü yineleme sırasında ayırmaya/ayrılmayacaktır. – ronag

cevap

4

tek yolu, test olacağını ama Bir iyileştirici Bu optimizasyonu yürütmek görmek oldukça şaşırtıcı olacaktır.

Hatta bu optimizasyonunu yapmak için başlamak için, derleyici ya 1) temelde herhangi biri diğeri için ayna görüntüsü olan operator new ve operator delete o (örneğin "gerçekleştirmek" için katılan fonksiyonlar) donanımları hakkında yeterli bilgiye gerekir, veya 2) aşağı operator new ve operator delete halinin çağrıları için (tüm fonksiyonlar inline için tüm yol tüm kod oluşturmak ve kodundan aynı sonuca anlamak mümkün yeterli istihbarat olması gerekir.

İlkini zar zor hayal edebiliyorum, ama hiç görmediğimi hatırlamıyorum .. Tipik bir yığın yöneticisinin karmaşıklığı göz önüne alındığında, ikinci vuruşlar m e gerçekten inanılmaz.

Alt satır: Daha önce şaşırmıştım ve eminim yine olacağım - ama çoğu insandan daha büyük bir sürpriz olurdu.

+2

Ayrıca, derleyici, örneğin, global değişkenlerin (örneğin, "errno" dahil olmak üzere) yan etkilerinden endişe etmelidir. –

0

Derleyicinin std kapsayıcılarını gerçekten bildiğini ve kendi isteğim olmadan yöntemlerini çağırdığını görmek beni şaşırtacaktır. Öyleyse, yeni bir kütüphane modülü çıktığında derleyicinin mantığının nasıl artırılacağını bir düşünün! Yine de bazı C++ derleyicilerinin Standart Kütüphane hakkında bilgi sahibi olduğunu bulmak ilginç olurdu.

DÜZENLEME: Tamam, böyle bir bilginin bir örneğini buldum: döngüler için C++ 11 aralığı tabanlı std :: begin ve std :: end, aralıklara uygulanır. Her neyse, yazdığımız kodun gerçekten ne anlama geldiğini anlamak ve onu optimize etmenin yollarını bulmak zorunda olan bizler programcılardır. Derleyici, yalnızca küçük (ama önemli) optimizasyonları uygulayan yönergelerimizi (inlining, elemenizi kopyala vb.) Uygulamalıdır.

İlgili konular