虚拟方法内存使用Java vs C ++

时间:2014-10-06 10:42:26

标签: java c++ memory virtual

警告:请记住,这个问题是完全错误的 - 这是一个错误的假设,因为我误解了一篇关于C ++的写得不好的教程(实际上是一本书)。如果你很好奇,这是原始内容:

  

在C ++中,将方法标记为虚拟会导致对象使用更多   内存 - 对于每个额外的虚拟方法,指针的内存   (4 - 8字节)更多。 Java如何处理所有方法   默认情况下是虚拟的吗?

2 个答案:

答案 0 :(得分:0)

您确定对象使用的内存更多吗?我会说你在虚拟功能表中使用了更多空间,但没有使用每个对象。

答案 1 :(得分:0)

您的基本假设不正确。对象的大小不会随着虚函数的增加而增加。

如果该类具有任何虚函数,则它具有指向该类的vtable的单个指针。无论有多少虚函数,对象的大小都不会发生变化:

struct s0 {};

struct s1
{
    virtual void f1() {}
};

struct s2
{
    virtual void f1() {}
    virtual void f2() {}
};

struct s3
{
    virtual void f1() {}
    virtual void f2() {}
    virtual void f3() {}
};

int main()
{
    std::cout << "s0: " << sizeof(s0) << '\n';
    std::cout << "s1: " << sizeof(s1) << '\n';
    std::cout << "s2: " << sizeof(s2) << '\n';
    std::cout << "s3: " << sizeof(s3) << '\n';
}

<强>结果:

s0: 1
s1: 8
s2: 8
s3: 8