以 dart 语言存储的类中的常量值在哪里以及多长时间?例如const Duration()(链接到下面的 img)。我知道 const 和 global 值存储在堆栈中,直到应用程序关闭。提前感谢您的回答。
为了使我的评论正式化,当您谈论存储在堆栈或堆上的值时,您是在谈论变量。变量以多种不同的形式存在,例如局部变量、全局变量、类成员变量、闭包变量等等。每种类型的变量以不同的方式存储在不同的位置,但一个(非常)概括的解释是所有变量要么存储在堆栈(遵循程序执行路径的线性内存部分)或堆(一个结构化程度较低的内存BLOB或多或少存在一个漫长的过程期间如果没有应用程序的生命周期。)当您指定 变量的值,您是在告诉程序转到该变量在内存中的位置并使其等于该值。
常量是一个完全不同的概念。它们没有被声明、实例化或赋值,并且询问它们是存储在堆栈上还是堆上是无意义的,因为它们不是变量。甲常数是已知和编目在编译时,例如一个值1,true和"Hello World"。当您声明一个常量(例如const SECONDS_IN_MINUTE = 60;)时,您不是在实例化一个变量,实际上您是在创建一个已知值的别名,编译器在使用该常量的任何地方替换该别名。(即代码int fiveMinutes = SECONDS_IN_MINUTE * 5;会被编译成int fiveMinutes = 60 * 5;*)
同样,const Duration(seconds: 1)它不是在运行时创建的变量或对象,而是在程序编译时和运行之前已知的值。这就是为什么当你声明一个常量构造函数时,类必须只有final字段,而参数只能是本身常量的类型,因为可以用非常量字段定义的对象根据定义不是常量。
更重要的是,Dart 支持一个称为规范常量的概念,这意味着您创建的每个常量都指向相同的值结构。例如:
var a = Duration(seconds: 1);
var b = Duration(seconds: 1);
var c = Duration(seconds: 1);
var d = Duration(seconds: 1);
Run Code Online (Sandbox Code Playgroud)
每个的a,b,c,和d变量存储非恒定值,则有四种不同的该装置Duration被彼此分离地创建的对象。另一方面:
var a = const Duration(seconds: 1);
var b = const Duration(seconds: 1);
var c = const Duration(seconds: 1);
var d = const Duration(seconds: 1);
Run Code Online (Sandbox Code Playgroud)
这些变量中的每一个都被分配了具有相同 值的常量值seconds,这意味着它们都指向相同的 值Duration。当您创建的应用程序使用许多可以保持不变的值时,这是大量优化的来源。(例如,如果您有许多Padding具有相同填充的小部件,将所有小部件更改EdgeInsets为常量将防止它们EdgeInsetsGeometry每次使用时都创建新的小部件。)
*:或者类似的东西这个假设当然了优化遍数不改变60 * 5成300或其他这样的预测优化。
| 归档时间: |
|
| 查看次数: |
571 次 |
| 最近记录: |