堆栈/堆中的c#内存分配发生

时间:2016-07-09 08:23:04

标签: c# memory-management

在c#中何时发生堆栈/堆中的内存分配。是在运行时还是编译时。从我的研究中我了解到,所有内存分配都在运行时发生,包括值类型和引用类型。这是对的吗?

2 个答案:

答案 0 :(得分:1)

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

内存管理它还优化了当你刚创建变量时可能不会发生,但是当你第一次使用它时。

答案 1 :(得分:0)

我认为您可能会混淆实际分配,实际分配只能在程序实际运行时在运行时进行,并具有分配计算/确定。例如,请考虑以下方法:

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

编译器现在将静态地(编译时)i将需要堆栈上的4个字节的空间。但是,直到程序实际运行才会发生实际分配。

此外,在CLR加载代码并将其传递给JIT(即时编译器)之前,上述方法甚至不会被编译成机器代码(任何操作,例如分配的先决条件)。当然,即使它确实如此,直到创建实际进程,操作系统甚至分配一个内存地址空间才能使用...