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

在上述情况下,为什么编译器不使函数成为非虚拟函数并节省分配给它的空间。有没有不这样做的具体原因?

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

4

3 回答 3

8

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

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

于 2013-07-01T17:27:24.613 回答
2

适当的编译器可能不会这样做,因为它不知道其他文件中的内容。

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

于 2013-07-01T17:30:51.033 回答
0

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

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

于 2013-07-01T17:37:33.733 回答