gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 20:15:38 24 4
gpt4 key购买 nike

对于下面的代码示例,指针执行方法“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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com