假设我有一个如下所示的类设置:
class A {
public:
virtual void foo() { printf("default implementation\n"); }
};
class B : public A {
public:
void foo() override { printf("B implementation\n"); }
};
class C : public B {
public:
inline void foo() final { A::foo(); }
};
int main(int argc, char **argv) {
auto c = new C();
c->foo();
}
一般来说,可以拨打c->foo()
被去虚拟化并内联到printf("default implementation")
称呼?例如在 gcc 中,这是有保证的吗?我的直觉是A::foo()
是非虚拟的,因为该类是显式指定的,因此printf
将始终被内联。
你问的是优化,所以一般来说我们必须选择一个编译器并尝试它。我们可以查看汇编输出来确定编译器是否按照您想要的方式进行优化。
让我们尝试一下 GCC 5.2: https://goo.gl/nkSg8R
.LC0:
.string "B implementation"
B::foo():
movl $.LC0, %edi
jmp puts
.LC2:
.string "default implementation"
A::foo():
movl $.LC2, %edi
jmp puts
C::foo():
movl $.LC2, %edi
jmp puts
main:
subq $8, %rsp
movl $8, %edi
call operator new(unsigned long)
movl $.LC2, %edi
call puts
xorl %eax, %eax
addq $8, %rsp
ret
让我们尝试一下 Clang 3.6 https://goo.gl/HctSB1:
main: # @main
pushq %rax
movl $.Lstr, %edi
callq puts
xorl %eax, %eax
popq %rdx
retq
.Lstr:
.asciz "default implementation"
在这两种情况下,您都可以非常清楚地看到所有虚拟函数都已内联。
“例如在海湾合作委员会中,这是有保证的吗?”
如果编译器对对象的实际类型有信心,那么我怀疑这种优化总是会发生。但我没有任何东西可以支持这个说法。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)