Mri*_*nal 79 .net c# heap stack
我对Stack vs Heap之间的内存分配基础感到困惑.根据标准定义(每个人都说的东西),所有值类型都将被分配到堆栈,参考类型将进入堆.
现在考虑以下示例:
class MyClass
{
int myInt = 0;
string myString = "Something";
}
class Program
{
static void Main(string[] args)
{
MyClass m = new MyClass();
}
}
Run Code Online (Sandbox Code Playgroud)
现在,内存分配将如何在c#中发生?MyClass(即m)的对象是否会完全分配给堆?也就是说,int myInt和string myString既会去堆?
或者,该对象将分为两部分,并将分配给两个内存位置,即堆栈和堆?
Gab*_*abe 63
你应该考虑的问题,其中的物体得到分配为实现细节.对您来说,确切地存储对象位的位置并不重要.对象是引用类型还是值类型可能很重要,但在开始必须优化垃圾收集行为之前,您不必担心它将存储在何处.
虽然引用类型总是在当前实现中在堆上分配,但值类型可以在堆栈上分配 - 但不一定.仅当值类型是未装箱的非转义本地或临时变量(未包含在引用类型中且未在寄存器中分配)时,才会在堆栈上分配值类型.
我错过了什么吗?
当然,如果我没有链接到Eric Lippert关于这个话题的帖子,我会失职:
Mud*_*Mud 53
m在堆上分配,包括myInt.在堆栈上分配基本类型(和结构)的情况是在方法调用期间,它为堆栈上的局部变量分配空间(因为它更快).例如:
class MyClass
{
int myInt = 0;
string myString = "Something";
void Foo(int x, int y) {
int rv = x + y + myInt;
myInt = 2^rv;
}
}
Run Code Online (Sandbox Code Playgroud)
rv,x,y都将在堆栈中.myInt在堆上的某个地方(必须通过this指针访问).
Mar*_*ell 21
"所有VALUE类型都将分配给Stack"是非常非常错误的; struct变量可以作为方法变量存在于堆栈中.但是,类型上的字段与该类型一起使用.如果字段的声明类型是类,则值作为该对象的一部分在堆上.如果字段的声明类型是结构,则字段是结构所在的结构的一部分.
甚至方法变量也可以在堆上,如果它们被捕获(lambda/anon-method),或者是(例如)迭代器块的一部分.
jga*_*fin 10
优秀的解释:
第1部分:http://www.c-sharpcorner.com/uploadfile/rmcochran/csharp_memory01122006130034pm/csharp_memory.aspx
第2部分:http://www.c-sharpcorner.com/UploadFile/rmcochran/csharp_memory2B01142006125918PM/csharp_memory2B.aspx
第3部分:http://www.c-sharpcorner.com/UploadFile/rmcochran/chsarp_memory401152006094206AM/chsarp_memory4.aspx
第4部分:http://www.c-sharpcorner.com/uploadfile/rmcochran/csharp_memory_401282006141834pm/csharp_memory_4.aspx
| 归档时间: |
|
| 查看次数: |
57333 次 |
| 最近记录: |