局部变量与指针性能

local variable vs pointer performance

本文关键字:性能 指针 局部变量      更新时间:2023-10-16

对于下面的代码示例,指针-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();
}

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)  

通过优化,至少对我来说,这两个调用都是内联的。