我一直试图找出与位置无关代码有关的一些事情,特别是使用带有-fpic
的gcc。
我编写了一个函数来测量将指针多次传递到堆栈所需的时间,然后通过传递副本来执行相同的操作。在我的例子中,我看到的效果只适用于没有继承或虚函数的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;
}
答案 0 :(得分:0)
您的代码使用尾递归,因此在-O3
处,代码被优化为while循环。因此,您的代码实际上是使用-fPIC
来衡量复制构造函数的开销。
当您尝试优化共享库时,需要考虑很多因素(-fPIC
标志的最常见用法)。如果您还没有这样做,请参阅Ulrich Drepper的优秀文章“如何编写共享库”。