局部变量vs指针性能

时间:2012-09-12 07:31:06

标签: c++

对于下面的代码示例,指针 - num_ptr执行方法“递增”的速度明显慢于局部变量 - 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();
}

1 个答案:

答案 0 :(得分:7)

num.increment();已静态解析,num_ptr->increment();将动态解析(该函数通过动态调度调用,因为它是virtual)。

但是,通过完全优化,编译器应该产生类似的结果。

没有选择:

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

VS

    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)  

通过优化,至少对我而言,两个调用都是内联的。