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