類似
for(int i=0;i<list.size();i++) {
...
}
編譯器如何進行的優化。
代碼:
#include <vector>
#include <windows.h>
using namespace std;
int main()
{
vector<int> a;
a.push_back(1);
char b[]="hello world";
for(int i=0;i<a.size();i++) {
a[i]++;
Sleep(100);
printf("%d",a[i]);
}
printf("%s",b);
return 0;
}
使用OllyDbg看了一下紅色部分的彙編代碼(使用的是visual studio 2005的release來編譯的)
可以發現每一次循環都會執行一次求size的函數。因此對於下面這樣的代碼:
for(int i=0;i<list.size();i++) {
...
}
寫成這樣效率會更高
int l=list.size();
for(int i=0;i<l;i++) {
...
}
以前一直誤以爲編譯器能幫忙進行這樣的優化,看來是不可能的。
自己想想也可以明白。
因爲編譯器根本不知道size這個函數就是用來求長度的,即使知道,在循環中也無法檢測有沒有改變list的大小(很容易構造一堆調用和指針來改變list的大小又不讓編譯器檢測出來)。
結論:不能過於依賴編譯器,很多代碼如果自己知道怎麼優化還是要手動優化。
但是呢,我還是傾向於
for(int i=0;i<list.size();i++) {
...
}
這樣的寫法,因爲這樣的寫法可讀性比較強。
至於要如何寫,只能根據實際情況,自己做權衡了。