2016-03-01 116 views
0

在C++中,使用array.at(i)函數或使用array[i]函數迭代arrayvector中的元素會更好嗎(性能方面)?比另一個更有效率嗎?C++ array.at(i)和array [i]的性能

+6

'at'執行邊界檢查,'operator []'不執行邊界檢查。所以前者的工作要比後者嚴格得多。 –

+2

[C++ Vector at/\ [\] operator speed]可能的重複(http://stackoverflow.com/questions/2578638/c-vector-at-operator-speed) – Michael

+0

這些成員函數都不會遍歷數組。它們提供對一個元素的索引訪問。 –

回答

7

at()方法對傳遞的索引執行邊界檢查,operator[]沒有。

因此,如果您有很多元素訪問,那麼使用at()從性能角度來看可能會更慢。

(我記得我做了一些測試大矩陣在舊版本的MSVC的,並有訪問每個項目有和沒有邊界檢查。像往常一樣,有疑問時,測量之間的差異。)

還要注意,在MSVC的一些實現中,operator[]調試構建中執行邊界檢查。

+1

關於你的最後一句:更確切地說,它是啓用檢查的'/ MDd'或'/ MTd'編譯器標誌。 –

+1

更準確地說,'operator []'不*執行邊界檢查。所以無論它是否執行都依賴於實現。通常情況下,優化版本不會,未優化版本通常會這樣做。 –

+0

@Martin這是真的嗎?我從來沒有聽說過選擇不同代碼路徑的優化器。 *調試*建立往往包括檢查,真實。但是你怎麼測試代碼中存在的優化器呢? –

0

如果代碼確實是通過數組迭代,則迭代代碼負責確保訪問不超出邊界。例如:

for (int i = 0; i < my_vec.size(); ++i) 
    std::cout << my_vec[i] << '\n'; 

有沒有必要通過檢查i是否出界的額外的開銷來構建。它不會。

相關問題