局部变量vs指针性能

Bry*_*Fok 3 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();
}
Run Code Online (Sandbox Code Playgroud)

Luc*_*ore 7

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

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

没有选择:

    num.increment();
00341453  lea         ecx,[num]  
00341456  call        concrete_number::increment (341186h)  
Run Code Online (Sandbox Code Playgroud)

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)  
Run Code Online (Sandbox Code Playgroud)

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