繁体   English   中英

未初始化的变量内存分配

[英]Uninitialized variable memory allocation

JavaScript范例

假设我这样做:

var i;

而且永远不要在程序的其他任何地方使用我。 会分配任何内存吗?

或者,如果我使用,请说i=2; 在几行之后....它会在此时分配内存,还是在创建i期间分配内存?

C#示例

假设我这样做:

dynamic i;

而且永远不要在程序的其他任何地方使用我。 是否会为其分配任何内存(如果有的话,什么时候?在编译期间?)?

或者,如果我使用,请说i = 2; 在几行之后....它会在此时分配内存,还是在创建i期间分配内存,还是在编译期间分配内存?

另外,除了由于JavaScript是一种解释语言而C#是一种编译语言这一事实​​而引起的差异之外,上述两个示例中的内存分配是否还有其他差异?

在C#中,表达式为:

var i;

不能首先编译; 如果我们考虑改为:

int i; // or dynamic i;

那么可以对其进行编译,也可以不保留,但这取决于它是字段 (对象变量)还是局部 (方法变量)。 字段不会被删除; 但是,编译器可以根据需要自由删除局部变量。 是否选择这样做取决于很多事情,但最值得注意的是:您是在进行优化的发布版本还是调试版本。 即使局部变量可以清楚地读写,编译器仍然可以选择删除它-当然,该仍将存在于堆栈中,但不在保留位置。

当Javascript解释器解析var i; 然后执行包含作用域,它必须将事实存储在当前作用域中现在已定义i变量的位置。 此范围内的期货参考将访问此范围内的此特定变量。 尽管实现细节留给实现者,但变量i可能会添加到特定的作用域对象中,因此必须消耗一些内存。

如果未引用该变量,并且该变量处于包含范围内而不使用eval() ,则JS引擎可能会对其进行优化。 它是否真正认为可以做到这一点,以及是否确实可以做到这一点,必须通过测试或研究源代码来发现。

这样的单个变量可能只消耗很少的内存。 要使这个问题具有重大意义,您可能必须拥有数千个这样的结果。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM