Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 内存中的方法存储在哪里?_C#_.net_Memory - Fatal编程技术网

C# 内存中的方法存储在哪里?

C# 内存中的方法存储在哪里?,c#,.net,memory,C#,.net,Memory,我了解到类字段存储在堆中,但是方法存储在哪里?在堆里还是在别的地方?它们是内联的吗?类方法与所有代码一起存储在专门用于存储代码的程序内存的专用段中。每个方法的代码存储一次。方法存储在内存中的其他位置。请注意,方法是针对每个类的,而不是针对每个实例的。因此,通常情况下,方法的数量不会随着程序的运行时间而改变(也有例外)。在传统模型中,方法所在的位置称为“代码段”。在.net中,更困难的是:方法最初存在于程序集中,并映射到进程内存中。在那里,即时编译器在本机代码中创建某些方法的第二个副本;此副本将被

我了解到类字段存储在堆中,但是方法存储在哪里?在堆里还是在别的地方?它们是内联的吗?

类方法与所有代码一起存储在专门用于存储代码的程序内存的专用段中。每个方法的代码存储一次。

方法存储在内存中的其他位置。请注意,方法是针对每个类的,而不是针对每个实例的。因此,通常情况下,方法的数量不会随着程序的运行时间而改变(也有例外)。在传统模型中,方法所在的位置称为“代码段”。在.net中,更困难的是:方法最初存在于程序集中,并映射到进程内存中。在那里,即时编译器在本机代码中创建某些方法的第二个副本;此副本将被执行。JIT代码在运行时可能会被创建和删除多次,因此将其视为“堆中”也是切实可行的。方法是每个类的:这意味着对于类,每个方法只存在一次。不同的实例仍然有相同的方法。属性/属性是每个实例的:每个实例都有一个属性,即不同的实例有不同的属性值。@Martin:我有一个问题。我不明白为什么每次执行该方法时JIT代码都会创建一个副本。你已经说过方法是每个类的,我100%同意这一点,但我也相信,当调用一个方法时,它引用的是同一个实际的方法,没有复制,因为如果有某种复制的东西(这就是你说的)如果我有一个有10000行代码的方法,我创建了该方法所属类的1000个实例,该方法中编译的代码的1000个副本是在内存中创建的,还是所有1000个对象共享相同的,无论是在方法的执行上还是在对象的初始化上?@Hansmukh:我并没有说JIT在每次执行方法时都会创建一个副本。相反,我说的是“在运行时多次”,这意味着JIT可以编译该方法一次,然后在一小时后丢弃它(如果一小时内没有调用它),然后在两小时后重新编译它,依此类推。至于1000个实例:注意我说过“每个类都有方法”;我是认真的。这也适用于JIT代码;在任何时间点,任何方法最多只能有一个JIT版本。@Zain:为了支持同时(或随后)激活方法,使用“调用堆栈”,包括“堆栈帧”。方法的每次调用都会创建一个新的堆栈框架(在一个称为“堆栈”的内存区域中),该框架由方法的所有参数以及任何局部变量组成。不同的对象不会导致问题:“this”只是作为参数0传递。