2016-07-09 89 views
0

在c#堆栈/堆中的内存分配何时发生。在运行时还是编译期间?从我的研究中,我明白所有的内存分配都是在运行时间内为值类型和引用类型发生的。它是否正确?堆栈/堆中的c#内存分配发生

+1

是,内存分配不能在编译时有发生。只有当程序运行时,该程序所需的所有对象('struct'或'class')才会被加载到内存中。 – EvilTak

+1

这是正确的...... – zerkms

+1

有人可能会争辩说,堆栈上的分配发生在编译时。然后,再次,实际更改堆栈指针的指令必须在运行时执行。这是一个愚蠢的问题。也许你应该阅读[堆栈和堆是什么](http://stackoverflow.com/questions/79923/what-and-where-are-the-stack-and-heap)。 –

回答

1

在编译期间会发生什么?程序尚未运行,程序运行前无需分配内存。这是常见的情况,应该在运行时发生(当实际执行生成的IL时)。

内存管理,也优化,当你只需要创建一个变量,可能不会发生,但是当你第一次使用它。

0

我想你可能会混淆的实际配置,它可以在程序实际运行,与分配计算/确定在运行时才会发生。例如,考虑以下的方法:

void Foo() 
{ 
    int i = 42; 
    Console.WriteLine(i); 
} 

编译器将现在静态(编译时间)i将需要4个字节的堆叠上的空间。但是,直到程序实际运行时才会发生实际分配。此外,直到CLR加载代码并将其传递给JIT(即时编译器),上述方法甚至不会被编译为机器代码(任何操作(如分配)的先决条件)。当然,即使它没有,它不是直到创建实际的过程中,该OS分配,甚至为它使用的内存地址空间...