C ++:由虚拟引起的内存开销?

时间:2012-05-07 05:12:24

标签: c++ memory inheritance

  

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

我是juste读到的: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 */};

假设我每个类有10亿个对象,我不得不打扰非静态内存消耗。那么对于每种对象类型多少钱? (如果AbstractA的每个虚方法都会为“A”类型的每个对象创建一个指针,我就死了......)

2 个答案:

答案 0 :(得分:5)

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

答案 1 :(得分:3)

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

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

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