【发布时间】:2013-10-05 11:04:47
【问题描述】:
现在,我知道不能保证内联,但是...
鉴于以下情况:
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 是一个常量表达式!
【问题讨论】:
-
你是使用
-O2还是使用默认参数? -
我在 GCC 和 Clang 中都尝试了
-O2。结果相同。