考虑以下程序:
#include <iostream>
class A {
public:
A() {}
virtual void a() {};
};
class B : public A { };
int main() {
B();
}
GCC(经过测试的4.4.0、8.3.0和9.1)为B::B()
(godbolt link)生成以下代码:
call A::A() [base object constructor]
movl $vtable for B+16, %edx
请注意,它在64位程序中执行了32位移动。 GCC如何确保存储vtable的.text
节将以32位地址结尾?
答案 0 :(得分:0)
这是根据GCC的小代码模型(-mcmodel=small
)得出的。尝试将-mcmodel=large
添加到编译器选项中,看看它如何发出movabsq
。
对How can gcc/clang assume a string constant's address is 32-bit?表示敬意。