我试图了解通过创建大量对象会导致什么样的内存损失。我知道每个对象 - 在创建时 - 将在 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 类型对象应该占用多少内存,包括代码和所有变量的空间?
最佳答案
“每个对象 - 在创建时 - 将在 HEAP 中为成员变量分配空间”不一定是真的。您创建的每个对象都会在某处为其成员变量占用一些非零空间,但在哪里取决于您如何分配对象本身。如果对象具有自动(堆栈)分配,那么它的数据成员也是如此。如果对象是在空闲存储(堆)上分配的,那么它的数据成员也是如此。毕竟,除了数据成员之外,对象的分配是什么?
如果堆栈分配的对象包含一个指针或其他类型,然后用于在堆上分配,则无论对象本身是在哪里创建的,该分配都将在堆上进行。
对于具有虚函数的对象,每个对象都将分配一个 vtable 指针,就好像它是类中显式声明的数据成员一样。
至于成员函数,就其在可执行镜像中的位置而言,它们的代码可能与自由函数代码没有什么不同。毕竟,成员函数基本上是一个自由函数,它的第一个参数是隐含的“this”指针。
继承不会改变任何事情。
我不确定您所说的 DLL 拥有自己的堆栈是什么意思。 DLL 不是程序,并且不需要堆栈(或堆),因为它分配的对象总是在具有自己的堆栈和堆的程序的上下文中分配。 DLL 中有代码(文本)和数据段确实是有道理的,尽管我不是在 Windows 上实现这些东西的专家(我假设你正在使用你的术语)。
关于c++ - 在 C++ 中,类函数放在内存的哪个位置?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/648647/