[英]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 new
和operator delete
基本上是其他任何一個的鏡像,或者2 )它必須生成內聯所有函數的所有代碼(一直到operator new
和operator delete
的調用,並且有足夠的智能來從代碼中推斷出相同的結論。
我幾乎無法想象第一個,但不記得曾經見過它。 鑒於典型的堆管理器的復雜性,第二個讓我感到非常難以置信。
一句話:我以前一直很驚訝,我相信我會再次出現 - 但是比大多數人更令人驚訝。
我會驚訝地發現編譯器實際上知道std容器並在沒有我的顯式請求的情況下調用它們的方法。 如果是這種情況,想象一下每當發布新的庫模塊時,編譯器的邏輯是如何需要增強的!
但是,有趣的是,發現某些C ++編譯器確實對標准庫有一定的了解。
編輯:好的,我找到了這樣的知識的一個例子:基於C ++ 11范圍的for循環將std :: begin和std :: end應用於范圍。
無論如何,我們的程序員必須真正了解我們編寫的代碼並找出優化方法。 編譯器應該簡單地翻譯我們的指令,僅應用小的(但重要的)優化(如內聯,復制省略等)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.