类定义怎么不占用内存?

时间:2017-08-16 11:57:26

标签: c++

所以我读过this关于类定义是否占用内存,this关于函数是否占用内存。这是我没有得到的:如果函数执行,或者代码如何,类定义怎么不占用内存。我的意思是,类定义也是代码,所以不应该像函数代码那样占用内存吗?

2 个答案:

答案 0 :(得分:4)

说类定义不占用内存并不完全正确:任何具有成员函数的类都可能会在内存中放置一些代码,尽管代码量及其实际位置在很大程度上取决于函数内联。

第一个链接上的Q& A讨论sizeof,它显示了类的每实例内存需求,它排除了存储成员函数,静态成员,内联函数,调度表和内存的内存要求。等等。这是因为所有这些元素都是在类的所有实例之间共享

答案 1 :(得分:0)

您不需要将类定义保留在任何位置,因为有关如何创建类实例的详细信息在其构造函数中进行编码。
(从某种意义上说,类定义代码,它没有明确表示。)

为了创建对象,您需要知道的是

  1. 有多大,
  2. 用于创建它的构造函数,以及
  3. 其虚拟功能是什么。
  4. 创建类A的实例:

    1. 保留一块大小为sizeof(A)的内存(或将其交给一位),
    2. 将该段内存与A的虚拟函数相关联,如果有的话(通常保存在预定位置的表中),
    3. 告诉应创建A的相关A构造函数,然后让它执行实际工作。
    4. 您不需要了解有关成员变量类型或类似内容的事情,构造函数知道一旦知道 要创建对象,该怎么做。<登记/> (每个成员变量都可以在对象开头的偏移处找到,因此构造函数知道必须在哪里。)

      另一方面,要创建函数,您需要以某种形式存储其定义,然后在运行时生成代码。 (这通常称为&#34;即时&#34;编译。)

      这需要编译器,这意味着你需要

      1. 在每个可执行文件中包含编译器,或
      2. 为所有可执行文件提供(或要求每个人安装)共享编译器(Java VM通常至少包含一个)。
      3. C ++编译器会提前生成函数 滥用术语一点,你可以说功能是&#34;实例化&#34;通过编译过程,将源代码作为蓝图。