对于下面的代码示例,指针 - 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 = #
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)
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)
通过优化,至少对我而言,两个调用都是内联的.