我正在玩一个简单的代码,试图了解如何使编译器优化分配和虚拟调用。我用c。我有以下代码:
// external functions
int acquire();
int do_something(int id);
namespace {
struct bar {
virtual int exec() = 0;
};
struct poof: bar {
poof() {
//id = acquire();
}
virtual int exec() {
return do_something(id);
}
int id = 0;
};
struct foo {
bar *b;
int operator()() {
return b->exec();
}
};
}
int main() {
foo e{new poof};
return e();
}
When compiling with clang-trunk and -O3我得到了以下经过优化的程序集:
main: # @main
xor edi, edi
jmp do_something(int) # TAILCALL
现在,取消注释行id = acquire();
的注释,我希望xor edi,edi
被call acquire(); mov edi, rax
之类的东西代替。相反,我看到编译器突然无法再优化动态分配和虚拟调用。
原因是什么,如何使编译器对其进行优化?