Ruu*_*uup 5 c++ compilation compiler-optimization
使用下面的代码,编译器a是否可以告诉它实际上是B虚拟表查找的实例并对其进行优化?
#include <iostream>
class A
{
public:
virtual void f()
{
std::cout << "A::f()" << std::endl;
}
};
class B : public A
{
public:
void f()
{
std::cout << "B::f()" << std::endl;
}
};
int main()
{
B b;
A* a = &b;
a->f();
return 0;
}
Run Code Online (Sandbox Code Playgroud)
在Jonthan Seng和reima的答案之后的其他问题:如果使用gcc,是否有必要使用任何标志来强制它优化vtable查找?
Clang可以轻松进行这种优化,甚至可以内联函数调用.这可以从生成的程序集中看出:
Dump of assembler code for function main():
0x0000000000400500 <+0>: push %rbp
0x0000000000400501 <+1>: mov %rsp,%rbp
0x0000000000400504 <+4>: mov $0x40060c,%edi
0x0000000000400509 <+9>: xor %al,%al
0x000000000040050b <+11>: callq 0x4003f0 <printf@plt>
0x0000000000400510 <+16>: xor %eax,%eax
0x0000000000400512 <+18>: pop %rbp
0x0000000000400513 <+19>: retq
Run Code Online (Sandbox Code Playgroud)
我冒昧地用std::cout << …等效的调用代替printf,因为这大大减少了拆卸中的混乱.
GCC 4.6还可以推断出不需要vtable查找,但不能内联:
Dump of assembler code for function main():
0x0000000000400560 <+0>: sub $0x18,%rsp
0x0000000000400564 <+4>: mov %rsp,%rdi
0x0000000000400567 <+7>: movq $0x4007c0,(%rsp)
0x000000000040056f <+15>: callq 0x400680 <B::f()>
0x0000000000400574 <+20>: xor %eax,%eax
0x0000000000400576 <+22>: add $0x18,%rsp
0x000000000040057a <+26>: retq
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1290 次 |
| 最近记录: |