为什么编译器在可能的情况下不使虚拟函数成为非虚函数?

时间:2013-07-01 17:24:19

标签: c++ oop gcc virtual-functions

class A{
     void virtual a(){}
};
int main() { 
    std::cout<<sizeof(A);
}

在上面的例子中,为什么编译器不使该函数非虚拟并保存分配给它的空间。有没有特定的理由不这样做?

我正在使用gcc 4.7编译器,如果它是特定于编译器的。

3 个答案:

答案 0 :(得分:8)

因为您可以在单独的翻译模块中创建派生类。

从理论上讲,这可以在链接时解决,但这将涉及大量工作,因此在实践中不会发生(AFAIK)。

答案 1 :(得分:2)

编译器可能不会这样做,因为它不知道其他文件中有什么。

链接器可能能够这样做,但不能保证A的后代版本不存在于某个地方,并且将被加载到单独的模块中。

答案 2 :(得分:0)

你确定你写的是真的吗?您在优化构建中的证据是什么?

我的观察是,如果程序确实包含用于创建A的单个实例的代码,则VMT不与程序链接,并且也不使用包括虚拟在内的函数。