【问题标题】:C++ : Memory overhead due to virtuality? [duplicate]C++:由于虚拟性导致的内存开销? [复制]
【发布时间】:2012-05-07 05:12:24
【问题描述】:

可能重复:
C++ virtual function table memory cost

我刚刚读到:http://www.parashift.com/c++-faq-lite/virtual-functions.html,我想知道由于虚拟性导致的内存开销是多少。 我目前正在为超级计算机编写优化代码,我必须在可读代码和内存消耗之间找到良好的平衡。

为了了解它是如何工作的,以下类的内存开销是多少:

class AbstractA {/* SOMETHING */};
class AbstractB {/* SOMETHING */};
class A : public AbstractA {/* SOMETHING */};
class B : public AbstractB {/* SOMETHING */};
class A2 : public A {/* SOMETHING */};
class B2 : public B {/* SOMETHING */};
class AbstractAB : public AbstractA, public AbstractB {/* SOMETHING */};
class AbstractAB2 : public AbstractAB {/* SOMETHING */};

假设我每个类有十亿个对象,我不得不担心非静态内存消耗。那么每种对象类型的费用是多少? (如果 AbstractA 的每个虚方法都会为每个“A”类型的对象创建一个指针,那我就死定了……)

【问题讨论】:

  • sizeof() 运算符的存在是有原因的。
  • @Mystical:这只会告诉您每个对象的成本。通常也有按课程收费。
  • @MikeSeymour 如果每个类有十亿个实例,那么每个类的成本对于每个对象的成本都可以忽略不计。

标签: c++ memory inheritance


【解决方案1】:

您可能想查看 Scott Meyer 的 More Effective C++ 的第 24 项。它的标题是“了解虚函数、多重继承、虚基类和 RTTI 的成本”。在这个项目中,迈耶斯讨论了使用这些设施所涉及的开销。

【讨论】:

  • 可能想看一些你甚至没有给我阅读动力的东西?其他人应该知道的第 24 项中的哪些内容?请总结一下。
  • 它的标题是“了解虚函数、多重继承、虚基类和 RTTI 的成本”。它有 10 页长,可能会提供您想了解的内容的洞察力。另外,作为一个善良的陌生人,我会告诉你,你看起来有点像个小鬼。您需要有必要的动机来查看可以回答您问题的建议来源。
  • @GManNickG 我添加了项目的标题和一行摘要。
  • @EXIT_FAILURE:如果它很容易获得,当然可以。如果我必须购买一本书,请等待 3-5 天,然后最后查看他所指的内容,看看它是关于什么的,不。我们将这样的评论称为评论,而不是解决方案。
  • @GManNickG:我的反应只是对 Sanket 的回答表现出的不满。我同意,它缺乏细节,但本可以更礼貌地提出要求。对我来说,对这样一个问题的认真回答需要涵盖很多领域,Scott Meyers 已经完成了。我认为人们会认识到这一点,并保证这本书与这个问题的相关性(通过投票),希望能提供阅读它的动力。再说一次,你的评论得到了好几票,所以我可能错了。
【解决方案2】:

它是由实现定义的,但几乎每个实现都会使用:

  • 每个多态对象 1 个指针(称为“vptr”)
  • 每个多态类的函数指针和其他 RTTI 信息(称为“vtable”)的静态表。

您可以使用sizeof 来检查每个对象的成本,除非您定义了大量的类,否则每个类的成本可能可以忽略不计。

【讨论】:

  • 其实一个对象甚至可以有多个vptr,当使用多重继承时。
猜你喜欢
  • 2012-12-09
  • 2010-12-10
  • 1970-01-01
  • 2016-04-02
  • 1970-01-01
  • 1970-01-01
  • 2017-05-01
  • 2016-07-24
  • 1970-01-01
相关资源
最近更新 更多