【问题标题】:Virtual methods memory usage Java vs C++ [closed]虚拟方法内存使用Java vs C++ [关闭]
【发布时间】:2014-11-30 14:43:12
【问题描述】:

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

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

【问题讨论】:

  • 简单的问题,但似乎没有人费心去评论它有什么问题。我希望这不是对 Java 的仇恨。
  • 你的假设是错误的。 C++ 对类而不是实例有单个虚拟方法表。
  • 首先,您能否提供一个参考,其中写的是“对于每个额外的虚拟方法,指针的内存(4 - 8 个字节)更多。”
  • 在我正在读的一本书里。
  • 你指的是哪本书?

标签: java c++ memory virtual


【解决方案1】:

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

如果类有任何虚函数,那么它有一个指向该类的 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

【讨论】:

  • 我做的一模一样。
【解决方案2】:

您确定对象正在使用更多内存吗?我会说您在虚函数表上使用了更多空间,但不是在每个对象上。

【讨论】:

  • 我正在看的书并不清楚这一点。
猜你喜欢
  • 2011-03-02
  • 2019-01-07
  • 2011-11-27
  • 1970-01-01
  • 2015-09-01
  • 2013-01-12
  • 1970-01-01
  • 2014-12-16
  • 1970-01-01
相关资源
最近更新 更多