【问题标题】:Moment of memory allocation of class?类的内存分配时刻?
【发布时间】:2022-01-15 01:25:22
【问题描述】:

形成下面的链接Difference between Definition and Declaration 说:

变量的定义说明了变量的存储位置。 IE。, 变量的内存是在定义的过程中分配的 变量。

据我所知,类的声明如下:

class stu ; 

类的定义如下:

class stu{
   public:
        int x; 
};

所以从上面的信息来看,这个类的内存分配应该在我写完类的完整定义时发生。但是, 来自this link 说:

创建类的实例时将分配内存。

这意味着内存将在我写的那一刻被分配

stu s;

所以我想知道内存为这个类分配的确切时间,换句话说,它发生在编译时或运行时?

【问题讨论】:

  • 您的引文说“变量的定义 [...]”。类定义本身不是变量定义。
  • 变量的定义和的定义是完全不同的两件事
  • 为了清楚起见,声明或定义类都不占用任何内存(编译器除外,在编译时)。但现在我们讨论的是编译器实现,而不是你的程序。
  • @Mat ,哦,我不知道这一点,你能告诉我更多关于“变量的定义”和“类的定义”之间的区别或任何有细节的参考吗?谢谢!

标签: c++ class memory-management


【解决方案1】:

一般来说:保存成员值的内存是在使用时分配的,这是在运行时分配的——除了一些例外。 (假设它没有被编译器优化掉)

类的前向声明是为了让编译器知道类型。

定义描述类:

  • 它的成员函数被转换成机器码。这些 - 取决于目标架构 - 存在于加载到内存中的数据部分中。所以成员函数在创建任何实例之前都会占用内存。
  • 编译器还存储有关内存布局的一些信息,这些信息要么是机器代码的一部分,要么也存在于数据段的某个位置。

然而,这个内存分配是关于类的描述,而不是当你谈论一个类型的内存分配时通常提到的。

保存成员值的内存是在使用时分配的,通​​常是在运行时。在某些情况下,类型实例的值可以在编译时确定,这可能会导致这些值也成为数据部分的一部分。

【讨论】:

  • 感谢您的明确回答。总结您的回答,在类的编译期间没有发生内存分配?但是这个概念不适用于 int,float ...等变量?
  • 更清楚一点,即使编译器在编译时读取类定义的代码,也没有内存分配,编译器只关心类的内存布局(数据成员的大小和其他变量)成员函数),实际的内存分配发生在运行时(创建类的实例)?
猜你喜欢
  • 1970-01-01
  • 2014-06-27
  • 1970-01-01
  • 2022-09-24
  • 2012-01-12
  • 2019-03-08
  • 2011-12-02
  • 2013-09-29
  • 2017-06-28
相关资源
最近更新 更多