所以我们有 2 个主要的内存栈和堆。当我创建一个简单的类(A obj)对象时,它是堆分配的,如果我们有需要堆分配和堆栈分配的数据成员,那么实际会发生什么?创建对象时在堆上分配了多少内存,并且从该对象的堆分配中排除了堆栈分配的数据成员。
class A{
public:
int height;
int * weight;
A(){
height=0;
weight= new int(100);
}
};
int main(){
A *obj = new A(); // what's the memory allocation for object
return 0;
}
我的假设是,当我们创建堆分配对象时,需要堆栈分配的数据成员是堆栈分配的,并且不计入堆上对象的内存分配,而其他需要堆分配的数据成员是堆分配的,并考虑用于对象内存分配。因此,在上面的分配中,我们只需要 4 字节的堆内存,因为只有单个数据成员,即指针。
所以我们有2个主要的内存栈和堆
这么说是很愚蠢的,你只是有记忆。无论是单个还是多个 RAM 棒、L* CPU 缓存、磁盘支持的内存映射文件、交换文件、磁带,都是内存。在现代操作系统中,它的正确名称是虚拟内存。无论您选择将其部分命名为“堆栈”、“堆”还是“小猫”,这都是您的选择。
因此,在上面的分配中,我们只需要 4 字节的堆内存,因为只有单个数据成员,即指针。
不,您的
sizeof(A)
(可能)等于 2 * sizeof(int)
。在 32 位 Intel 系统上,(可能)是 8 个字节。这就是使用 new
调用时 A
运算符分配的内存量。
权重=新的int(100);
与您的问题无关,但很可能不会按照您的想法进行。它不会分配 100 个
int
项的数组,而是分配一个 int
并将其初始化为 100。
成员函数存储在哪里?
函数就是代码,代码存储在可执行文件的文本段中。然后,操作系统可执行加载程序和内存管理器将其映射到虚拟内存,从而允许指针引用它。
虚拟成员函数不同,指向它们的指针存储在类分配内的隐藏分配中。你碰巧看到了上面那些“可能”吗?虚函数表是其中的原因之一,它使分配比看起来更大。