簡體   English   中英

使用與位置無關的代碼傳遞值和指針

[英]passing by value and by pointer using position independent code

我一直試圖找出一些與位置無關代碼有關的事情,特別是使用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;
}

您的代碼使用尾遞歸,因此在-O3 ,代碼被優化為while循環。 因此,您的代碼實際上是在測量帶有和不帶-fPIC的復制構造函數的開銷。

當您嘗試優化共享庫(最常見的-fPIC標志使用)時,需要考慮很多事情。 如果您還沒有這樣做,請查閱Ulrich Drepper的優秀文章“如何編寫共享庫”。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM