3

以下のコード例では、ポインタ - num_ptr によるメソッド "increment" の実行速度は、ローカル変数 - num よりも大幅に遅くなります。仮想方式が関係していると思うのですが、理由がわかりません。これを説明してください。この例からパフォーマンスの問題を理解しようとしています。

#include <iostream>

const long long iterations_count = 1000000;

// a number interface
struct number {        
    virtual void increment() = 0;
};

struct concrete_number:number
{
    long long a;
    concrete_number(long long p){
        a = p;
    }
    void increment()
    {
        a+=1;
    }
};

int main() {

    concrete_number num(0);
    concrete_number* num_ptr = &num;

    for (long long i = 0; i < iterations_count; i++) {
        num.increment();
    }

    for (long long i = 0; i < iterations_count; i++) {
        num_ptr->increment();
    }
    std::getchar();
}
4

1 に答える 1

7

num.increment();は静的にnum_ptr->increment();解決され、動的に解決されます (関数は であるため、動的ディスパッチを介して呼び出されますvirtual)。

ただし、完全な最適化をオンにすると、コンパイラは同様の結果を生成するはずです。

最適化なし:

    num.increment();
00341453  lea         ecx,[num]  
00341456  call        concrete_number::increment (341186h)  

    num_ptr->increment();
00341490  mov         eax,dword ptr [num_ptr]  
00341493  mov         edx,dword ptr [eax]  
00341495  mov         esi,esp  
00341497  mov         ecx,dword ptr [num_ptr]  
0034149A  mov         eax,dword ptr [edx]  
0034149C  call        eax  
0034149E  cmp         esi,esp  
003414A0  call        @ILT+340(__RTC_CheckEsp) (341159h)  

最適化により、少なくとも私にとっては、両方の呼び出しがインライン化されます。

于 2012-09-12T07:32:43.463 に答える