在C++中,使用array.at(i)
函數或使用array[i]
函數迭代array
或vector
中的元素會更好嗎(性能方面)?比另一個更有效率嗎?C++ array.at(i)和array [i]的性能
回答
at()
方法對傳遞的索引執行邊界檢查,operator[]
沒有。
因此,如果您有很多元素訪問,那麼使用at()
從性能角度來看可能會更慢。
(我記得我做了一些測試大矩陣在舊版本的MSVC的,並有訪問每個項目有和沒有邊界檢查。像往常一樣,有疑問時,測量之間的差異。)
還要注意,在MSVC的一些實現中,operator[]
在調試構建中執行邊界檢查。
關於你的最後一句:更確切地說,它是啓用檢查的'/ MDd'或'/ MTd'編譯器標誌。 –
更準確地說,'operator []'不*執行邊界檢查。所以無論它是否執行都依賴於實現。通常情況下,優化版本不會,未優化版本通常會這樣做。 –
@Martin這是真的嗎?我從來沒有聽說過選擇不同代碼路徑的優化器。 *調試*建立往往包括檢查,真實。但是你怎麼測試代碼中存在的優化器呢? –
對於std::vector::at
或std::array::at
,
返回在指定的位置POS與邊界檢查一個參考元件,。
而對於std::vector::operator[]
或std::array::operator[]
,
返回在指定的位置POS一個參考元件。 無界限檢查執行。
因此理論上,operator[]
會更有效率。在實際情況中,你可以測量。
如果代碼確實是通過數組迭代,則迭代代碼負責確保訪問不超出邊界。例如:
for (int i = 0; i < my_vec.size(); ++i)
std::cout << my_vec[i] << '\n';
有沒有必要通過檢查i
是否出界的額外的開銷來構建。它不會。
- 1. i = i ++ + ++ c的輸出差異;和i = ++ i + C++;
- 2. C#中++ i和i ++之間有任何性能差異嗎?
- 3. 當我訪問時(table-> array [i] [i]),得到運行時錯誤,min =(table-> array [i] [i])。max = arr [i];
- 4. Increment ++ i,i ++和i + = 1
- 5. PHP數組 - 方括號與大括號($ array [$ i] vs $ array {$ i})
- 6. 德爾福的inc(i)和i:= i + 1之間有性能差異嗎?
- 7. VBA I/O性能
- 8. 就原子性而言,i ++和i = i + 1之間的區別
- 9. Linux中的I/O性能
- 10. i = i + j有什麼區別;和i + = j;在C語言?
- 11. Javascript for i not printing array
- 12. i和i = i ++ in for循環java
- 13. I/O操作性能
- 14. win32 I/O性能問題
- 15. Groovy I/O性能問題
- 16. 使用「for(i = 0; elem = array [i]; i ++)」來迭代數組有什麼風險?
- 17. 在C/C++爲x [I] *值Y [i ++]總是等於x [I] * Y [I]
- 18. C中的「a +++ i」等於「(a ++)+ i」
- 19. 爲什麼Array(100).map((_,i)=> i + 1)不返回[1,2,...,100]?
- 20. i ++和++ i有什麼區別?
- 21. 意義的I(I())
- 22. 此聲明計數的含義[array [i]]
- 23. *(matrix1 + i)和* matrix1 [i]之間的區別?
- 24. Javascript:Forloop i ++和(i + 1)之間的區別
- 25. 爲什麼對於(int i = 0; i <10; ++ i)和for(int i = 0; i <10; i ++)返回相同?
- 26. 有可能對於兩個正整數i和j,(-i)/ j不等於 - (i/j)?
- 27. i = i ++不增加i。爲什麼?
- 28. C++ ifstream I/O?
- 29. 功能裏面的提示while循環和i = i + 1,Matlab
- 30. out [i] = *(a_mat + i)在C中做什麼?
'at'執行邊界檢查,'operator []'不執行邊界檢查。所以前者的工作要比後者嚴格得多。 –
[C++ Vector at/\ [\] operator speed]可能的重複(http://stackoverflow.com/questions/2578638/c-vector-at-operator-speed) – Michael
這些成員函數都不會遍歷數組。它們提供對一個元素的索引訪問。 –