3

次のケースを検討してください

void func(const A& a)
{
    //Case 1:
    const int& val = a->b->c->d;
    func1(val);
    func2(val);

    //Case 2:
    func1(a->b->c->d);
    func2(a->b->c->d);

    //Case3:
    int val = a->b->c->d;
    func1(val);
    func2(val);
}

読みやすさに関しては、Case3が最も簡単です

速度について、まともなコンパイラの場合、上記のすべてのケースは同等ですか? そうでない場合、どちらが最速で最も遅いですか?

すべてのポインターが生のポインターであり、ヒープ内のオブジェクトを指していると仮定します。

更新: 引数がconst上記のようなものであると仮定すると、func1 と func2 は値または const 参照のいずれかで引数を取ることができます。

4

2 に答える 2

1

両方の関数が値によって引数を取ると仮定すると、ケース3は少なくともケース1と同じくらい高速であり、少なくともケース2と同じくらい高速です。

コメントでruakhが述べたように、最適化が行われる前に必要ないくつかの複雑なデータフロー分析があります。

関数パラメータが参照である場合、値の最終的なメモリロードが行われない可能性があります。その場合、ケース1が最速になります。

そして、それらが関数ではなくマクロである場合、すべての賭けは無効になります。

于 2012-09-28T19:02:29.150 に答える
0

最初のシナリオでは、valでa-> b-> c-> dを参照します。そのため、コンパイラのpovvalからは逆参照ポインタになります。

wrt speed 3番目の速度は、その値を使用するよりも値のコピーを作成するだけなので、最速です。

最初の2つの方法の問題は、値を取得するためにポインターを逆参照する必要があるため、実行する必要があることです。

case 1
lea eax,[ebp+a]
push eax

case 2
lea eax, [ebp+a]
lea ebx, [eax]
....

case 3
mov eax [ebp+val]
push eax

3番目が最速であることがはっきりとわかります

于 2012-09-28T19:02:33.310 に答える