栈内存只用于指针,堆内存用于对象吗?
Is stack memory only for pointers and heap for objects?
首先,我目前在 C# 工作,并且一直在阅读内存管理方面的知识。到目前为止,我已经阅读了一些关于堆栈溢出的很好的答案,解释了堆栈内存和托管堆内存之间的区别。大多数答案都声明:
int x = 5
,您正在为堆栈内存中的 x
类型分配足够的内存。
我明白它是如何工作的以及它的范围,但是当我阅读堆内存的解释时,它让我感到困惑。
如果你说 int x = 5
,因为 int
是 System.Int32
的别名,从技术上讲 x
不会是指向 System.Int32
的新实例的指针结构?如果是这样,它不会被存储在堆内存中,因为它用于实例对象。
在 this 教程中,它指出(对于 class1 cls1 = new class1()
行):
... creates a pointer on the stack and the actual object is stored in a different type of memory location called ‘Heap’.
按照这个逻辑,不就是所有的东西都存储在堆上,只有指针存储在栈上吗?例如 System.String
、System.Int64
、System.Boolean
、System.Decimal
等
的新实例
我以为我理解它,但显然我不理解,所以我很感激有人解释堆栈是否仅用于指针或我误解了哪一部分。提前致谢。
您可能需要查看 Classes and structs (MSDN) 以了解存储内容的位置和方式:
int x = 1; // 32 bits holding an integer in the stack
System.Object bo = x; // 32+some more bits are on the heap to hold the "boxed" (wrapped to be kept on the heap) integer value
System.Object ho = new Object(); // some bits are created on the heap right from the start
简单来说,有两种类型的对象:类 和结构。 类(引用类型)意味着存储在堆上并有一个指向它们的指针,而结构意味着存储在堆栈中(结构可以重新定位到堆,尽管有一点包装开销("boxing") 他们).
如果您真的need/want了解 CLR 的一般工作原理,请考虑阅读 "CLR via C#"(里希特)。
您可以使用以下规则:如果它是一个结构(包括基本类型),则在声明它的地方分配它,否则分配一个指向堆中对象的指针。
可能的位置是:
- 对于局部变量,它是一个堆栈。请注意,物理值可以存储在 CPU 寄存器中而不是堆栈中。
- 对于 class 字段,它位于堆中为 class 实例分配的连续内存块内。
- 对于静态字段,它作为类型元数据的一部分分配在加载程序堆中(如果我错了请纠正我)。
警告:这只是基本的、不全面的解释,目的是让您对正在发生的事情有一个基本的了解。现实要复杂得多。局部变量可以被提升并移动到堆中,优化器可以完全消除它们,等等...
首先,我目前在 C# 工作,并且一直在阅读内存管理方面的知识。到目前为止,我已经阅读了一些关于堆栈溢出的很好的答案,解释了堆栈内存和托管堆内存之间的区别。大多数答案都声明:
int x = 5
,您正在为堆栈内存中的 x
类型分配足够的内存。
我明白它是如何工作的以及它的范围,但是当我阅读堆内存的解释时,它让我感到困惑。
如果你说 int x = 5
,因为 int
是 System.Int32
的别名,从技术上讲 x
不会是指向 System.Int32
的新实例的指针结构?如果是这样,它不会被存储在堆内存中,因为它用于实例对象。
在 this 教程中,它指出(对于 class1 cls1 = new class1()
行):
... creates a pointer on the stack and the actual object is stored in a different type of memory location called ‘Heap’.
按照这个逻辑,不就是所有的东西都存储在堆上,只有指针存储在栈上吗?例如
System.String
、System.Int64
、System.Boolean
、System.Decimal
等 的新实例 我以为我理解它,但显然我不理解,所以我很感激有人解释堆栈是否仅用于指针或我误解了哪一部分。提前致谢。
您可能需要查看 Classes and structs (MSDN) 以了解存储内容的位置和方式:
int x = 1; // 32 bits holding an integer in the stack
System.Object bo = x; // 32+some more bits are on the heap to hold the "boxed" (wrapped to be kept on the heap) integer value
System.Object ho = new Object(); // some bits are created on the heap right from the start
简单来说,有两种类型的对象:类 和结构。 类(引用类型)意味着存储在堆上并有一个指向它们的指针,而结构意味着存储在堆栈中(结构可以重新定位到堆,尽管有一点包装开销("boxing") 他们).
如果您真的need/want了解 CLR 的一般工作原理,请考虑阅读 "CLR via C#"(里希特)。
您可以使用以下规则:如果它是一个结构(包括基本类型),则在声明它的地方分配它,否则分配一个指向堆中对象的指针。
可能的位置是:
- 对于局部变量,它是一个堆栈。请注意,物理值可以存储在 CPU 寄存器中而不是堆栈中。
- 对于 class 字段,它位于堆中为 class 实例分配的连续内存块内。
- 对于静态字段,它作为类型元数据的一部分分配在加载程序堆中(如果我错了请纠正我)。
警告:这只是基本的、不全面的解释,目的是让您对正在发生的事情有一个基本的了解。现实要复杂得多。局部变量可以被提升并移动到堆中,优化器可以完全消除它们,等等...