【发布时间】:2018-02-06 20:54:37
【问题描述】:
class Base {
public:
Base() {}
virtual void Get() { }
};
class Derivered : public Base {
public:
virtual void Get() { }
};
int main() {
Base* base = new Derivered();
base->Get();
return 0;
}
我使用gcc 5.4.0编译代码,使用objdump -S a.out反汇编二进制文件。我想找到Base的vptr,但只显示一个未知地址0x80487d4。最大地址数是0x80487b7,我看不懂。
命令列表:g++ test.cpp -O0; objdump -S a.out
080486fe <_ZN4BaseC1Ev>:
80486fe: 55 push %ebp
80486ff: 89 e5 mov %esp,%ebp
8048701: ba d4 87 04 08 mov $0x80487d4,%edx
8048706: 8b 45 08 mov 0x8(%ebp),%eax
8048709: 89 10 mov %edx,(%eax)
【问题讨论】:
-
确保优化已关闭。
-
你读过这个article 吗?
-
如果你开启优化,编译器很容易Devirtualize函数调用,内联它,甚至消除它,就像在这个上下文中一样,
-
是的,优化已关闭。
-
显示
objdump -h a.out的输出
标签: c++ linux gcc code-generation vptr