C++ C++;:虚拟性导致的内存开销?

C++ C++;:虚拟性导致的内存开销?,c++,memory,inheritance,C++,Memory,Inheritance,可能重复: 我刚刚读过:我想知道虚拟性带来的内存开销是多少。 我目前正在为超级计算机编写优化的代码,我必须在可读代码和内存消耗之间找到良好的平衡 为了了解其工作原理,以下类的内存开销是多少: class AbstractA {/* SOMETHING */}; class AbstractB {/* SOMETHING */}; class A : public AbstractA {/* SOMETHING */}; class B : public AbstractB {/* SOMETH

可能重复:

我刚刚读过:我想知道虚拟性带来的内存开销是多少。 我目前正在为超级计算机编写优化的代码,我必须在可读代码和内存消耗之间找到良好的平衡

为了了解其工作原理,以下类的内存开销是多少:

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 */};

假设每个类有10亿个对象,我就不得不担心非静态内存消耗。那么每种对象类型需要多少钱呢?(如果AbstractA的每个虚拟方法将为每个类型为“a”的对象创建一个指针,我死了…

您可能想看看Scott Meyer的第24项。它的标题是“了解虚拟函数、多重继承、虚拟基类和RTTI的成本”。在这一项中,迈耶斯对使用这些设施所涉及的管理费用进行了说明

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

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

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

存在
sizeof()
操作符是有原因的。@Mystical:这只告诉您每个对象的成本。通常每个类的成本也是一样的。@MikeSeymour如果每个类有10亿个实例,那么每个类的成本对于每个对象的成本来说是微不足道的。我可能想看看你甚至没有给我阅读动机的东西?第24项中其他人应该知道什么?请总结一下,它的标题是“了解虚拟函数、多重继承、虚拟基类和RTTI的成本”。它有10页长,可能会提供您想要了解的信息。另外,作为一个善良的陌生人,我要告诉你,你表现得有点孩子气。您需要找到必要的动机来寻找回答您问题的建议来源。@GManNickG我添加了标题和该项目的一行摘要。@EXIT\u失败:如果它随时可用,请确定。如果我必须买一本书,等3-5天,然后最后看看他指的是什么,看看是关于什么的,不。我们会把这样的评论称为评论,而不是解决办法。@GManNickG:我的反应只是对桑凯特的回答表现出不满。我同意,它缺乏细节,但这本可以被更礼貌地要求的。对我来说,对这样一个问题的严肃回答需要涵盖很多领域,斯科特·梅耶斯(Scott Meyers)已经完成了这项工作。我想人们会认识到这一点,并(通过投票)证明这本书与这个问题相关,希望能提供阅读它的动机。再说一次,你的评论得到了几次投票,所以我可能错了。事实上,当使用多重继承时,一个对象甚至可以有几个vptr。