类定义怎么能不占用内存?

How can class definitions not occupy memory?

本文关键字:内存 定义 怎么能      更新时间:2023-10-16

所以我读过关于类定义是否占用内存的文章,以及关于函数是否占用内存的文章。这就是我没有得到的:如果函数或它们的代码占用内存,为什么类定义不占用内存。我的意思是,类定义也是代码,所以不应该像函数代码一样占用内存吗?

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

第一个链接的问答谈到了sizeof,它显示了类的每个实例的内存需求,其中不包括存储成员函数、静态成员、内联函数、调度表等的内存需求。这是因为所有这些元素都在类的所有实例之间共享

不需要将类定义保留在任何地方,因为有关如何创建类实例的详细信息已编码在其构造函数中。
(从某种意义上说,类定义代码,只是没有显式表示。

为了创建一个对象,你需要知道的只是

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

创建类A的实例:

  1. 保留一块大小sizeof(A)的记忆(或递给一个(,
  2. 将该块内存与A的虚函数相关联,如果有的话(通常保存在预定位置的表中(,以及
  3. 告诉相关的A构造函数应该在哪里创建A,然后让它做实际工作。

你不需要知道成员变量的类型或类似的东西,构造函数一旦知道要在哪里创建对象就知道该怎么做。
(每个成员变量都可以在对象开头的偏移量处找到,因此构造函数知道东西必须在哪里。

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

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

  1. 在每个可执行文件中包含一个编译器,或者
  2. 为所有可执行文件提供(或要求每个人安装(共享编译器(Java VM 通常至少包含一个可执行文件(。

C++编译器会提前生成函数。
稍微滥用术语,你可以说函数是由编译过程"实例化"的,源代码作为蓝图。