2012-05-21 56 views
1

我不知道C++編譯器是否會像基於範圍的循環一樣展開基於範圍的循環,它們與「正常」循環相同,以最大限度地提高性能,或者在某些情況下,基於範圍的循環會比正常循環慢?C++ 2011:基於範圍的循環展開?

非常感謝。

+5

編譯器有可能將基於範圍的for循環轉換爲它們的常規循環對象,所以我期望它們是等效的。 –

+1

@ K-ballo:也許你應該將此作爲答案? –

回答

7

用於基於範圍的環等同於:

{ 
    auto && __range = (/expression/); 
    for (auto __begin = begin(__range), 
      __end = end(__range); 
     __begin != __end; 
     ++__begin) { 
    /declaration/ = *__begin; 
    /statement/ 
    } 
} 

如果編譯器知道迭代的數量和它可以解決循環依賴性或環是獨立的,則編譯器可以自由地取消輥。

一般來說,循環展開只會改善較小循環的性能。所以,國際海事組織,基於範圍的循環是否展開並不重要。當然,您可以使用-O3-funroll-loops以及相關選項進行基準測試,看看兩者之間是否確實存在差異。

5

編譯器有可能將基於範圍的for循環轉換爲它們的常規循環對象,所以我期望它們是等價的。