我试图通过创建大量对象来了解我会招致什么样的内存打击。我知道每个对象 - 在创建时 - 将在 HEAP 中为成员变量分配空间,并且我认为属于该类型对象的每个函数的所有代码都存在于内存中的代码段中 - 永久存在。
那正确吗?
因此,如果我在 C++ 中创建 100 个对象,我 可以估计 我将需要空间用于对象拥有的所有成员变量乘以 100(此处可能存在对齐问题),然后我需要在代码段中为单个副本留出空间该类型对象的每个成员函数的代码(不是 100 个代码副本)。
虚函数、多态性、继承是否以某种方式影响了这一点?
来自动态链接库的对象呢?我假设 dll 有自己的堆栈、堆、代码和数据段。
简单示例(可能在语法上不正确):
// parent class
class Bar
{
public:
Bar() {};
~Bar() {};
// pure virtual function
virtual void doSomething() = 0;
protected:
// a protected variable
int mProtectedVar;
}
// our object class that we'll create multiple instances of
class Foo : public Bar
{
public:
Foo() {};
~Foo() {};
// implement pure virtual function
void doSomething() { mPrivate = 0; }
// a couple public functions
int getPrivateVar() { return mPrivate; }
void setPrivateVar(int v) { mPrivate = v; }
// a couple public variables
int mPublicVar;
char mPublicVar2;
private:
// a couple private variables
int mPrivate;
char mPrivateVar2;
}
大约 100 个动态分配的 Foo 类型的对象应该占用多少内存,包括代码和所有变量的空间?
原文由 petrocket 发布,翻译遵循 CC BY-SA 4.0 许可协议
“每个对象 - 在创建时 - 将在 HEAP 中为成员变量分配空间”并不一定是真的。您创建的每个对象都会在某处为其成员变量占用一些非零空间,但在哪里取决于您如何分配对象本身。如果对象具有自动(堆栈)分配,那么它的数据成员也是如此。如果对象是在空闲存储(堆)上分配的,那么它的数据成员也是如此。毕竟,除了其数据成员之外,对象的分配是什么?
如果堆栈分配的对象包含然后用于在堆上分配的指针或其他类型,则无论对象本身是在哪里创建的,该分配都将发生在堆上。
对于具有虚函数的对象,每个对象都将分配一个 vtable 指针,就好像它是类中显式声明的数据成员一样。
至于成员函数,就其在可执行映像中的位置而言,它们的代码可能与自由函数代码没有什么不同。毕竟,成员函数基本上是一个以隐式“this”指针作为其第一个参数的自由函数。
继承不会改变任何事情。
我不确定你对 DLL 获得自己的堆栈是什么意思。 DLL 不是程序,并且不需要堆栈(或堆),因为它分配的对象总是在具有自己的堆栈和堆的程序的上下文中分配。在 DLL 中会有代码(文本)和数据段确实是有道理的,尽管我不是在 Windows 上实现这些东西的专家(我假设你正在使用你的术语)。