类定义怎么能不占用内存?
How can class definitions not occupy memory?
所以我读过关于类定义是否占用内存的文章,以及关于函数是否占用内存的文章。这就是我没有得到的:如果函数或它们的代码占用内存,为什么类定义不占用内存。我的意思是,类定义也是代码,所以不应该像函数代码一样占用内存吗?
说类定义不占用内存并不完全正确:任何具有成员函数的类都可以在内存中放置一些代码,尽管代码量及其实际位置在很大程度上取决于函数内联。
第一个链接的问答谈到了sizeof
,它显示了类的每个实例的内存需求,其中不包括存储成员函数、静态成员、内联函数、调度表等的内存需求。这是因为所有这些元素都在类的所有实例之间共享。
不需要将类定义保留在任何地方,因为有关如何创建类实例的详细信息已编码在其构造函数中。
(从某种意义上说,类定义是代码,只是没有显式表示。
为了创建一个对象,你需要知道的只是
- 它有多大,
- 用于创建它的构造函数,以及
- 它的虚拟功能是什么。
创建类A
的实例:
- 保留一块大小
sizeof(A)
的记忆(或递给一个(, - 将该块内存与
A
的虚函数相关联,如果有的话(通常保存在预定位置的表中(,以及 - 告诉相关的
A
构造函数应该在哪里创建A
,然后让它做实际工作。
你不需要知道成员变量的类型或类似的东西,构造函数一旦知道要在哪里创建对象就知道该怎么做。
(每个成员变量都可以在对象开头的偏移量处找到,因此构造函数知道东西必须在哪里。
另一方面,要创建函数,您需要以某种形式存储其定义,然后在运行时生成代码。(这通常称为"实时"编译。
这需要一个编译器,这意味着你需要
- 在每个可执行文件中包含一个编译器,或者
- 为所有可执行文件提供(或要求每个人安装(共享编译器(Java VM 通常至少包含一个可执行文件(。
C++编译器会提前生成函数。
稍微滥用术语,你可以说函数是由编译过程"实例化"的,源代码作为蓝图。
相关文章:
- 使用模板类的自定义列表类型中的内存泄漏
- 具有相同特征的两个对象是否只在内存中存储一次?无论定义它们的函数是什么,都是不同的
- 内存中类位置的成员是否取决于类成员在类定义中的位置?
- 在 Microsoft Access SQL 中调用自定义 DLL 函数时传递的内存地址无效
- 自己的自定义向量类. 内存重新分配
- 引用释放的内存是未定义的行为吗?
- 将预处理器配置定义迁移到 constexpr,而不会造成内存膨胀
- 自定义内存管理器在发布模式下工作正常,但在调试模式下则不然
- 目标c是否需要一个标准来定义像c++11这样的内存模型
- 如何返回定义良好的内存部分?例如来自图像数据的像素的颜色值
- shared_ptr的删除程序是否存储在自定义分配器分配的内存中?
- 自定义哈希表实现-将字符串映射到整数时出现内存错误
- 结构向量中自定义结构函数的内存使用
- 类定义怎么能不占用内存?
- 适用于 std::unique_ptr 的内存高效自定义删除器?
- 如何在没有动态内存分配(堆)的情况下为可变大小数组(矢量)定义安全容器或视图
- COM 互操作结构定义与内存布局不匹配
- 为什么要对堆栈中的内存使用自定义动态内存分配?
- 内存定义的位置
- 通过结构和重载操作符包装CUDA共享内存定义和访问