3

私は、特に 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;
}
4

1 に答える 1

0

コードは末尾再帰を使用しているため、-O3で、コードは while ループに最適化されます。したがって、あなたのコードは実際にコピー コンストラクターを使用した場合と使用しない場合のコストを測定しています-fPIC

共有ライブラリを最適化しようとするときは、考慮すべきことがたくさんあります (-fPICフラグの最も一般的な使用法)。まだ行っていない場合は、Ulrich Drepper の優れた記事「共有ライブラリの作成方法」を参照してください。

于 2012-06-04T03:43:38.557 に答える