編譯器的優化問題

類似
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來編譯的)

asm


可以發現每一次循環都會執行一次求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++) {
...
}
這樣的寫法,因爲這樣的寫法可讀性比較強。
至於要如何寫,只能根據實際情況,自己做權衡了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章