c++ - 局部变量与指针性能

标签 c++

对于下面的代码示例,指针执行方法“increment”的速度 - 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();
}

最佳答案

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

但是,在启用全面优化的情况下,编译器应该会产生类似的结果。

无优化:

    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)  

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

关于c++ - 局部变量与指针性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12383196/

相关文章:

c++ - 我们如何将一个位置的 RVA(相对虚拟地址)映射到 PE 文件偏移量?

c++ - 确定模板函数的返回类型

c++ - 删除前更新一组元素指针中的元素

c++ - 将函数定义放在头文件中

c++ - 在 C++ 中使用什么代替基础对象

c++ - 如果我使用框架,如何在另一台计算机上运行 mac exe?

c++ - Vector of Vector 如何在内存中对齐?

c++ - 大括号初始化时 GCC 出现编译错误

c++ - 将一个CMakeLists文件分成多个项目

c++ - 将 std::List 与对象指针一起使用