class A{
void virtual a(){}
};
int main() {
std::cout<<sizeof(A);
}
在上面的例子中,为什么编译器不使该函数非虚拟并保存分配给它的空间。有没有特定的理由不这样做?
我正在使用gcc 4.7编译器,如果它是特定于编译器的。
答案 0 :(得分:8)
因为您可以在单独的翻译模块中创建派生类。
从理论上讲,这可以在链接时解决,但这将涉及大量工作,因此在实践中不会发生(AFAIK)。
答案 1 :(得分:2)
编译器可能不会这样做,因为它不知道其他文件中有什么。
链接器可能能够这样做,但不能保证A的后代版本不存在于某个地方,并且将被加载到单独的模块中。
答案 2 :(得分:0)
你确定你写的是真的吗?您在优化构建中的证据是什么?
我的观察是,如果程序确实包含用于创建A的单个实例的代码,则VMT不与程序链接,并且也不使用包括虚拟在内的函数。