未初始化的可变内存分配

时间:2015-03-31 07:07:59

标签: javascript c# variables initialization

JavaScript示例

假设我这样做:

var i;

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

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

C#示例

假设我这样做:

dynamic i;

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

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

此外,除了由于JavaScript是解释性语言且C#是编译语言这一事实​​而产生的差异外,上述两个示例中的内存分配是否会有任何其他差异?

2 个答案:

答案 0 :(得分:0)

在C#中,表达式为:

var i;

首先无法编译;如果我们考虑一下:

int i; // or dynamic i;

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

答案 1 :(得分:0)

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

如果没有引用变量并且它在一个包含的范围内而不使用像eval()这样的东西,那么JS引擎可能能够优化它。它是否真的认为它可以做到并且实际上是这样做的,必须通过测试或研究源代码来发现。

像这样的个别变量可能只消耗非常少量的内存。因为这是重要的后果,你可能需要有数以千计的这些。