2015-03-03 36 views
2

最近我一直在做我的代碼如下:在for-each循環中使用吸氣劑效率低下嗎?

for(auto& item : something.getSomeVector()) 

當我開始我的優化過程,我開始懷疑,如果這不是像下面這樣效率不高:

std::vector<Type> vTypes = something.getSomeVector(); 
for(auto& item : vTypes) 

會一個for-each循環複製矢量或只是不斷調用該函數?

謝謝!

+1

我沒有看到編譯器無法優化的原因,但找出最簡單的方法是編寫基準測試,除非您更喜歡讀取程序集。 – merlin2011 2015-03-03 04:51:58

+0

進行測試或閱讀裝配... – 2015-03-03 04:53:47

+0

對不起,裝配體是什麼? Google只會顯示轉換爲彙編語言。 – MrSnappingTurtle 2015-03-03 05:05:09

回答

8

基於範圍的循環的定義是你的代碼擴展到與此非常相似的東西,一個塊中:

auto && __range = something.getSomeVector(); 
auto __begin = begin(__range); 
auto __end = end(__range); 

for (; __begin != __end; ++__begin) 
{ 
    auto &item = *__begin; 

因此,大家可以看到,它已經是最佳的,並且你所建議的改進,甚至可能讓事情變得更糟(如果通過引用返回函數,那麼你創建了一個以前沒有做過的副本)。

+1

小問題與這個問題沒有多大關係:它實際上定義爲'auto __begin = begin(__ range),__end = end(__ range);'這意味着兩個迭代器被強制爲相同的類型。 – 5gon12eder 2015-03-03 05:13:06

+0

@ 5gon12eder謝謝你指出。我認爲我正在澄清它,但忽略了細微差別(雖然在理論上'end'和'begin'應該永遠不會有不同的類型) – 2015-03-03 05:20:49

+0

是的,它們不應該。最近我被這個問題困擾了,因爲我認爲我可以變得聰明並且有'begin()'和'end()'返回不同的類型...... – 5gon12eder 2015-03-03 05:24:02