Gri*_*zly 1 memory memory-management heap-memory stack-memory dart
我知道在 Dart 中所有数据类型都是对象,包括数字和布尔值,在其他语言中数字和布尔值存储在堆栈中,复杂数据(如对象或列表)存储在堆中,在 Dart 中它如何存储它?内存中的值?我只想知道这一点。
这取决于优化,但大多数值都分配在垃圾收集堆上。
Dart 语言规范没有说明如何在内存中表示值,因此这取决于个人的实现。
在 Web 上,值存储为 JavaScript 值,无论 JavaScript 引擎以何种方式存储这些值。这通常是垃圾收集堆,加上 JS JIT 可以执行的任何优化。
虚拟机本身会分配一个垃圾收集堆并在其中存储对象。堆对于不同类型和大小的对象有不同的区域,对于新分配的对象有特定的区域,并且只有在它们存活足够长的时间时才将它们移动到旧空间(qv 分代垃圾收集)。
常量值分配在堆段中,甚至可以在隔离之间共享。小整数(对于 64 位平台上相当大的“小”大小)甚至没有分配,它们直接存储在“对象引用”(标记指针)内,使用标记位将它们与内存引用(称为“ Smi"s,“小整数”)。
VM可以优化一些值以保留在堆栈上(简单的、短期值的堆栈分配,将复合值分配到简单值组中)。是否安全取决于对象的用途和结构。
有些值可能永远不会在内存中具体化。如果编译器可以看到它只是在不久之后使用,那么它可以保留在寄存器中
简单值,如整数、双精度值和布尔值,也可能被拆箱并且永远不会分配实际的对象。当a + b + c所有都是整数时,没有理由分配一个对象来存储中间结果,它可以保留为机器整数,直到找到a + b的值并将其添加到其中。c中间结果(可以被识别)可以以任何方式存储,因为除了编译器自己的代码之外没有其他人可以访问它们。
未装箱的布尔值可能只是状态寄存器标志。执行if (a < b) ... else ...,其中a和b是整数,最终只能得到(英特尔语法)机器指令cmp rcx, rdx; jge elseLable;。
目前没有办法控制代表性。您不能要求在堆栈上分配对象。如果您确保分配函数和对象本身永远不会泄漏对它的任何引用,并且该函数足够热,可以通过昂贵的优化来优化,那么您也许能够获得它。星星是对的。
仅当优化不可观察时才有效。当任何代码实际查看一个值时,它的行为必须符合语言的要求,这对于大多数对象来说包括在使用identical. (Dart 3 中的记录对象不需要具有持久标识。如果数字具有相同的值,则它们被定义identical为具有相同的标识,因此可以安全地拆箱和重新装箱,只是在对它们进行操作时可能会产生额外的费用。 )
所以,这取决于(取决于优化)。