2012-06-01 31 views
3

我一直在試圖找出一些事情要做位置獨立代碼,具體使用gcc與-fpic傳遞值和指針使用位置獨立代碼

我已經寫了一個函數,用於度量在堆棧上多次傳遞一個指針所花的時間,然後通過傳遞一個副本來執行相同的操作。在我的例子中,我看到的效果只適用於沒有繼承或虛函數的struct或簡單類。

爲什麼使用PIC時指針會變慢(稍微)?爲什麼副本的速度要快很多,因爲沒有PIC呢?我正在編譯-03也。

class basicClass 
{ 
    private: 
    char ar[2000]; 
}; 

void PassCopy(basicClass cpy) 
{ 
    static long count = 0; 
    count++; 
    if(count < 100000) 
    PassCopy(cpy); 
} 

void PassPtr(basicClass * ptr) 
{ 
    static long count = 0; 
    count++; 
    if(count < 100000) 
     PassRegPtr(ptr); 
} 

void RunCopyTest() 
{ 
    basicClass c; 

    timeval tv1, tv2; 

    gettimeofday(&tv1, NULL); 
    PassCopy(c); 
    gettimeofday(&tv2, NULL); 

    long long diff1 = (tv2.tv_sec * MICROSECONDS_PER_SEC + tv2.tv_usec) 
        - (tv1.tv_sec * MICROSECONDS_PER_SEC + tv1.tv_usec); 

    basicClass *pc= new basicClass(); 
    gettimeofday(&tv1, NULL); 
    PassRegPtr(pc); 
    gettimeofday(&tv2, NULL); 
    delete pc; 

    long long diff2 = (tv2.tv_sec * MICROSECONDS_PER_SEC + tv2.tv_usec) 
        - (tv1.tv_sec * MICROSECONDS_PER_SEC + tv1.tv_usec); 

    std::cout << "Diff 1 = " << diff1 << " Diff 2 = " << diff2 << std::endl; 
} 
+2

爲什麼在標籤爲C的代碼中使用'class'?另外,讀取生成的代碼進行比較。 – unwind

+0

我懷疑這個代碼實際上是按照你的想法編譯的。您知道副本通常是在堆棧中創建的,而具有100,000個2千字節對象的副本將佔用200兆的堆棧。我敢打賭,你的籌碼是16個左右。看看生成的彙編代碼。事實上,您可以比較2個版本生成的代碼,並告訴我們有什麼不同。 – Dan

回答

0

你的代碼是使用尾遞歸,所以在-O3,代碼被優化成while循環。因此,你的代碼真的在測量有和沒有-fPIC的拷貝構造函數的花費。

當您試圖優化共享庫(-fPIC標誌的最常見用途)時,有很多事情需要考慮。如果您還沒有這樣做,請諮詢Ulrich Drepper的優秀文章「如何編寫共享庫」。