私は、特に gcc with を使用して、位置に依存しないコードで行ういくつかのことを理解しようとしてい-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;
}