最近我一直在做我的代碼如下:在for-each循環中使用吸氣劑效率低下嗎?
for(auto& item : something.getSomeVector())
當我開始我的優化過程,我開始懷疑,如果這不是像下面這樣效率不高:
std::vector<Type> vTypes = something.getSomeVector();
for(auto& item : vTypes)
會一個for-each
循環複製矢量或只是不斷調用該函數?
謝謝!
最近我一直在做我的代碼如下:在for-each循環中使用吸氣劑效率低下嗎?
for(auto& item : something.getSomeVector())
當我開始我的優化過程,我開始懷疑,如果這不是像下面這樣效率不高:
std::vector<Type> vTypes = something.getSomeVector();
for(auto& item : vTypes)
會一個for-each
循環複製矢量或只是不斷調用該函數?
謝謝!
基於範圍的循環的定義是你的代碼擴展到與此非常相似的東西,一個塊中:
auto && __range = something.getSomeVector();
auto __begin = begin(__range);
auto __end = end(__range);
for (; __begin != __end; ++__begin)
{
auto &item = *__begin;
因此,大家可以看到,它已經是最佳的,並且你所建議的改進,甚至可能讓事情變得更糟(如果通過引用返回函數,那麼你創建了一個以前沒有做過的副本)。
小問題與這個問題沒有多大關係:它實際上定義爲'auto __begin = begin(__ range),__end = end(__ range);'這意味着兩個迭代器被強制爲相同的類型。 – 5gon12eder 2015-03-03 05:13:06
@ 5gon12eder謝謝你指出。我認爲我正在澄清它,但忽略了細微差別(雖然在理論上'end'和'begin'應該永遠不會有不同的類型) – 2015-03-03 05:20:49
是的,它們不應該。最近我被這個問題困擾了,因爲我認爲我可以變得聰明並且有'begin()'和'end()'返回不同的類型...... – 5gon12eder 2015-03-03 05:24:02
我沒有看到編譯器無法優化的原因,但找出最簡單的方法是編寫基準測試,除非您更喜歡讀取程序集。 – merlin2011 2015-03-03 04:51:58
進行測試或閱讀裝配... – 2015-03-03 04:53:47
對不起,裝配體是什麼? Google只會顯示轉換爲彙編語言。 – MrSnappingTurtle 2015-03-03 05:05:09