C++:由于虚拟性而导致的内存开销

C++ : Memory overhead due to virtuality?

本文关键字:内存 开销 虚拟性 C++      更新时间:2023-10-16

可能的重复项:
C++虚函数表内存成本

我刚刚读到: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"的对象创建一个指针,我死了......

你可能

想看看斯科特·迈耶(Scott Meyer)的更有效C++的第24项。它的标题是"了解虚拟函数、多重继承、虚拟基类和 RTTI 的成本"。在本项目中,迈耶斯介绍了使用这些设施所涉及的开销。

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

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

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