为何编译器内联时不对final类的调用进行去虚拟化?
final类虚函数调用的编译器优化疑问
struct base { virtual void vcall() = 0; }; struct foo final : base { void vcall() final; }; void call_base(base& b) { b.vcall(); } void call_foo(foo& f) { call_base(f); } void call_foo_directly(foo& f) { f.vcall(); }
clang 16编译生成如下汇编:
call_base(base&): mov rax, qword ptr [rdi] jmp qword ptr [rax] call_foo(foo&): mov rax, qword ptr [rdi] jmp qword ptr [rax] call_foo_directly(foo&): jmp foo::vcall()@PLT
GCC与MSVC的编译结果一致,因此这并非Clang独有的问题。那么call_foo函数中是否也可以直接调用非虚的foo::vcall()?这属于编译器遗漏的优化,还是该调用确实必须为虚调用?
内容的提问来源于stack exchange,提问作者Jan Schultke
相关产品推荐
相关产品推荐

