C++中类对象及其数据成员的内存是如何分配的

问题描述 投票:0回答:1

所以我们有 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 字节的堆内存,因为只有单个数据成员,即指针。

c++ class dynamic-memory-allocation
1个回答
0
投票

所以我们有2个主要的内存栈和堆

这么说是很愚蠢的,你只是有记忆。无论是单个还是多个 RAM 棒、L* CPU 缓存、磁盘支持的内存映射文件、交换文件、磁带,都是内存。在现代操作系统中,它的正确名称是虚拟内存。无论您选择将其部分命名为“堆栈”、“堆”还是“小猫”,这都是您的选择。

因此,在上面的分配中,我们只需要 4 字节的堆内存,因为只有单个数据成员,即指针。

不,您的

sizeof(A)
(可能)等于
2 * sizeof(int)
。在 32 位 Intel 系统上,(可能)是 8 个字节。这就是使用
new
调用时
A
运算符分配的内存量。

权重=新的int(100);

与您的问题无关,但很可能不会按照您的想法进行。它不会分配 100 个

int
项的数组,而是分配一个
int
并将其初始化为 100。

成员函数存储在哪里?

函数就是代码,代码存储在可执行文件的文本段中。然后,操作系统可执行加载程序和内存管理器将其映射到虚拟内存,从而允许指针引用它。

虚拟成员函数不同,指向它们的指针存储在类分配内的隐藏分配中。你碰巧看到了上面那些“可能”吗?虚函数表是其中的原因之一,它使分配比看起来更大。

© www.soinside.com 2019 - 2024. All rights reserved.