堆栈内存仅用于指针和堆栈用于对象吗?

时间:2016-09-09 14:37:01

标签: c# pointers memory heap-memory stack-memory

首先,我目前在C#工作,而且我一直在阅读内存管理。到目前为止,我已经阅读了关于堆栈溢出的一些很好的答案,解释了堆栈内存和托管堆内存之间的区别。大多数答案都表明通过声明:
<?php setlocale (LC_TIME, 'fr_FR.utf8','fra'); // FIX date & time email $date_line = strftime("%A %d %B"); $time_line = date('H:i:s'); ?> ,您为堆栈内存中的int x = 5类型分配了足够的内存。

我理解它是如何工作的以及它的范围,但是当我读到堆存储器的解释时,它让我很困惑。

如果您说x,因为int x = 5int的别名,从技术上讲,System.Int32不是x的新实例的指针{1}}结构?如果是这样,那么它就不会存储在堆内存中,因为它用于例如对象。

this教程中,它指出(对于行System.Int32):

...在堆栈上创建一个指针,实际对象存储在一个名为'Heap'的不同类型的内存位置。

通过这个逻辑,isn&#39;存储在堆上的所有内容以及只存储在堆栈上的指针?示例是class1 cls1 = new class1()System.StringSystem.Int64System.Boolean等的新实例。

我以为我明白了,但是很明显我不知道,所以我很感激有人解释堆栈是仅用于指针还是我误解的部分。在此先感谢。

2 个答案:

答案 0 :(得分:3)

您可以使用以下规则:如果它是一个结构(包括基本类型),则将其分配到声明的位置,否则将分配指向堆中对象的指针。

可能的位置是:

  1. 对于局部变量,它是一个堆栈。请注意,物理值可以存储在CPU寄存器中而不是堆栈中。
  2. 对于类字段,它位于堆中为类的实例分配的连续内存块内。
  3. 对于静态字段,它在加载程序堆中作为类型元数据的一部分进行分配(如果我错了,请更正我)。
  4. 警告:这只是基本的,非全面的解释,可以基本了解正在发生的事情。现实更加复杂。局部变量可以被提升并移动到堆,优化器可以完全消除它们等等......

答案 1 :(得分:-1)

您可能需要查看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

简单来说,有两种类型的对象:类和结构。类(引用类型)意味着存储在堆上并且有一个指向它们的指针,而结构体应该存储在堆栈中(结构可以重新定位到堆中,虽然带有一点包装开销(&#34) ;拳击&#34;)他们)。

如果您真的需要/想要了解CLR的工作原理,请考虑通过C#&#34;阅读&#34; CLR。 (里氏)。