我试图了解通过创建大量对象会导致什么样的内存损失。我知道每个对象(在创建时)都会在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上实现这些功能不是很熟练(我假设您使用的是给定的术语)。