JavaScript示例 :
假设我这样做:
var i;
永远不要在程序的任何其他地方使用我。它会分配任何内存吗?
或者如果我使用,在某些行之后说i=2;
....此时是否会分配内存,还是在创建i期间分配的内存?
C#示例 :
假设我这样做:
dynamic i;
永远不要在程序的任何其他地方使用我。是否会分配任何内存(如果是,那么?在编译期间?)?
或者如果我使用,说i = 2;在某些行之后....此时是否会分配内存,还是在创建i期间分配的内存,还是在编译期间分配?
此外,除了由于JavaScript是解释性语言且C#是编译语言这一事实而产生的差异外,上述两个示例中的内存分配是否会有任何其他差异?
答案 0 :(得分:0)
在C#中,表达式为:
var i;
首先无法编译;如果我们考虑一下:
int i; // or dynamic i;
然后可以编译,可以保留,也可以不保留,但这取决于它是字段(对象变量)还是 local (方法变量) 。字段不会被删除;但是,编译器可以根据需要随意删除局部变量。它是否选择这样做可能取决于很多事情,但最值得注意的是:您是否正在进行优化的发布版本,而不是调试版本。即使本地变量显然都被写入和读取,编译器仍然可以在选择时将其删除 - 当然,值仍然存在于堆栈中,但不存在于保留位置。
答案 1 :(得分:0)
当Javascript解释器解析var i;
然后执行包含范围时,它必须将事实存储在i
变量现在在当前范围中定义的位置。此范围内的期货参考将访问此范围内的此特定变量。虽然实现细节留给实现者,但变量i
可能会添加到特定的范围对象中,因此必须占用一些内存。
如果没有引用变量并且它在一个包含的范围内而不使用像eval()
这样的东西,那么JS引擎可能能够优化它。它是否真的认为它可以做到并且实际上是这样做的,必须通过测试或研究源代码来发现。
像这样的个别变量可能只消耗非常少量的内存。因为这是重要的后果,你可能需要有数以千计的这些。