簡體   English   中英

優化器是否會將臨時非POD類型移出循環?

[英]Do optimizers move temporary non-POD types out of loops?

給出以下代碼:

while(is_running)
{
     std::vector<buffer> buffers;

     // fill buffers

     // use buffers
}

現代編譯器是否執行以下轉換?

std::vector<bufer> buffers;

while(is_running)
{
     // fill buffers

     // use buffers

     buffers.clear();
}

確切知道的唯一方法是測試, 我會驚訝地看到優化器執行此優化。

為了開始執行這種優化,編譯器必須要么1)足夠了解所涉及的函數的內部結構以“實現”(例如) operator newoperator delete基本上是其他任何一個的鏡像,或者2 )它必須生成內聯所有函數的所有代碼(一直到operator newoperator delete的調用,並且有足夠的智能來從代碼中推斷出相同的結論。

我幾乎無法想象第一個,但不記得曾經見過它。 鑒於典型的堆管理器的復雜性,第二個讓我感到非常難以置信。

一句話:我以前一直很驚訝,我相信我會再次出現 - 但是比大多數人更令人驚訝。

我會驚訝地發現編譯器實際上知道std容器並在沒有我的顯式請求的情況下調用它們的方法。 如果是這種情況,想象一下每當發布新的庫模塊時,編譯器的邏輯是如何需要增強的!

但是,有趣的是,發現某些C ++編譯器確實對標准庫有一定的了解。

編輯:好的,我找到了這樣的知識的一個例子:基於C ++ 11范圍的for循環將std :: begin和std :: end應用於范圍。

無論如何,我們的程序員必須真正了解我們編寫的代碼並找出優化方法。 編譯器應該簡單地翻譯我們的指令,僅應用小的(但重要的)優化(如內聯,復制省略等)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM