繁体   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