gpt4 book ai didi

c++ - 使用位置无关代码按值和指针传递

转载 作者:太空狗 更新时间:2023-10-29 23:19:05 25 4
gpt4 key购买 nike

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

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

为什么使用 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 的优秀文章“如何编写共享库”。

关于c++ - 使用位置无关代码按值和指针传递,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10843176/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com