现在,我知道没有内联保证,但是......
鉴于以下情况:
struct Base {
virtual int f() = 0;
};
struct Derived : public Base {
virtual int f() final override {
return 42;
}
};
extern Base* b;
我们有:
int main() {
return static_cast<Derived*>(b)->f();
}
编译为:
main:
movl $42, %eax
ret
然而...
int main() {
return (static_cast<Derived*>(b)->*(&Derived::f))();
}
编译为:
main:
pushl %ebp
movl %esp, %ebp
andl $-16, %esp
subl $16, %esp
movl b, %eax
movl (%eax), %edx
movl %eax, (%esp)
call *(%edx)
leave
ret
这真是令人难过。
为什么没有内联对 PMF 的调用? PMF 是一个常量表达式!
最佳答案
这里的问题是,在第一种情况下,基于类型的去虚拟化将间接调用变成了直接调用。
当你添加一个成员指针时,不能使用基于类型的去虚拟化(因为它通过前端传递给关于类型和被调用的虚拟方法的优化信息来工作,在这种情况下,这些信息不是很容易知道的)。 GCC
通过知道 B
是一个类并且知道它的成员只能被调用,可能能够不断地将实际访问折叠到 virtual table
中建成后。目前它不做这样的分析。
我建议填写GCC
bugzilla 的增强请求。
关于c++ - 调用常量指向成员函数的指针未被内联,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19079741/