3
我一直在試圖找出一些事情要做位置獨立代碼,具體使用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;
}
爲什麼在標籤爲C的代碼中使用'class'?另外,讀取生成的代碼進行比較。 – unwind
我懷疑這個代碼實際上是按照你的想法編譯的。您知道副本通常是在堆棧中創建的,而具有100,000個2千字節對象的副本將佔用200兆的堆棧。我敢打賭,你的籌碼是16個左右。看看生成的彙編代碼。事實上,您可以比較2個版本生成的代碼,並告訴我們有什麼不同。 – Dan