首先,我目前在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 = 5
是int
的别名,从技术上讲,System.Int32
不是x
的新实例的指针{1}}结构?如果是这样,那么它就不会存储在堆内存中,因为它用于例如对象。
在this教程中,它指出(对于行System.Int32
):
...在堆栈上创建一个指针,实际对象存储在一个名为'Heap'的不同类型的内存位置。
class1 cls1 = new class1()
,System.String
,System.Int64
,System.Boolean
等的新实例。
答案 0 :(得分:3)
您可以使用以下规则:如果它是一个结构(包括基本类型),则将其分配到声明的位置,否则将分配指向堆中对象的指针。
可能的位置是:
警告:这只是基本的,非全面的解释,可以基本了解正在发生的事情。现实更加复杂。局部变量可以被提升并移动到堆,优化器可以完全消除它们等等......
答案 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。 (里氏)。