2015-03-31 80 views
0

JavaScript示例未初始化的变量内存分配

假设我这样做:

var i; 

,从不使用我其他地方的计划。它会被分配任何内存吗?

或者如果我使用,说i=2;后一些行....将它分配内存在这一点上,或者是在创建我的内存分配?

C#示例

假设我这样做:

dynamic i; 

,从不使用我其他地方的计划。它是否会被分配任何内存(如果它是,什么时候?在编译过程中?)?

或者如果我使用,说我= 2;在一些行之后......将在这时分配内存,还是在创建i期间分配的内存,还是在编译过程中分配的内存?

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

回答

0

在C#,表达式:

var i; 

不能在第一位置被编译;如果我们考虑相反:

int i; // or dynamic i; 

然后可以被编译,并且可以或可以不被保留,但是这取决于它是否是一个字段(对象变量)与一个本地(方法变量)。字段不会被删除;但是,编译器可以自由地删除本地变量,因为它认为合适。它是否选择这样做可能取决于很多事情,但最显着的是:是否正在进行优化版本构建,而不是调试构建。即使局部变量明显被写入和读取,编译器仍然可以将其删除 - 当然,值仍将存在于堆栈中,但不在保留位置。

0

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

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

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