使用与位置无关的代码按值和指针传递

passing by value and by pointer using position independent code

本文关键字:指针 代码 位置      更新时间:2023-10-16

我一直在尝试找出与位置无关代码的一些事情,特别是将 gcc 与 -fpic 一起使用。

我编写了一个函数,该函数测量在堆栈中多次传递指针所花费的时间,然后通过传递副本来执行相同的操作。在我的示例中,我看到的效果仅适用于没有继承或虚函数的结构或简单类。

为什么在使用 PIC 时指针会变慢(一点点)?为什么副本变得比没有 PIC 时快得多?

我也在和-O3一起编译。

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的优秀文章"如何编写共享库"。