C++:由于虚拟性而导致的内存开销
C++ : Memory overhead due to virtuality?
可能的重复项:
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
来检查每个对象的成本,除非您定义大量类,否则每个类的成本可能可以忽略不计。
相关文章:
- 将字符串存储在c++中的稳定内存中
- C++ 指针的内存地址和指向数组的内存地址如何相同?
- Win32编译器选项和内存分配
- 实现无开销push_back的最佳方法是什么
- 将 mmap 内存用于开销非常低的循环缓冲区
- 有没有办法从 STL 获取无开销的原始内存容器
- 由 pybind11 包装的对象的内存开销
- 库达内存传输开销
- 英特尔TBB内存开销
- C++constexpr数组查找:内存开销?其他问题
- 每个对象内存分配有多少开销
- 在Windows上打开文件的内存开销是什么?
- C++ 在 clon 中构建内存开销
- C++:由于虚拟性而导致的内存开销
- C++对象与结构内存开销
- 用于编辑文本的最小cpu和内存开销数据结构
- Linux内存管理开销
- RTOS: windows ce:实模式和保护模式内存访问开销
- OpenMP代码远慢于串行内存或线程开销瓶颈
- malloc()与new[]的内存开销