- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我对如何为强类型泛型管理内存有疑问
List<int> ints1 = new List<int>();
ints1.Add(1); ints1.Add(2); ints1.Add(3);
int[] ints2 = new int[10]();
ints2.Add(6); ints2.Add(7); ints2.Add(8);
问题 1:我假设 ints1 是用新关键字 ( new List<int>()
) 初始化的,它变成了引用类型。值 1、2、3 存储在内存中的什么位置(它们存储在堆栈中还是堆中)?
问题 2:我知道 List<int>
之间的事情和 int[]
, List<int>
可以在运行时将其大小缩放到任意大小,这在 int[]
中受到限制在编译时。因此,如果将值 1、2、3 存储在堆栈中,如果将新项目添加到 List<int>
比如说4,它不会连续到前3吧,那么ints1怎么知道4的内存位置呢?
最佳答案
I presume as ints1 is initialised with a new keyword
new List<int>()
it becomes a reference type
这个假设是不正确的。您也可以在值类型上使用“new”关键字!
int x = new int();
使用“new”不会使任何内容成为引用类型。您可以将“new”与引用类型或值类型一起使用。 “new”表示将分配存储空间并调用构造函数。
在值类型上使用“new”的情况下,分配的存储是临时存储。对该临时存储的引用被传递给构造函数,然后将现在初始化的结果复制到它的最终目的地(如果有的话)。 (“new”通常与赋值一起使用,但不一定如此。)
在引用类型的情况下,存储分配两次:长期存储分配给实例,短期存储分配给对长期存储的引用实例的。引用被传递给构造函数,构造函数初始化长期存储。然后将引用从短期存储复制到其最终目的地(如果有的话)。
是什么造就了List<int>
引用类型是 List<T>
被声明为一个类。
Where are the values 1,2,3 are stored in memory (are they stored in stack or on heap)?
我们一直在努力制作一个内存管理器,让您不必关心东西的存储位置。值存储在短期内存池(作为堆栈或寄存器实现)或长期内存池(作为垃圾收集堆实现)中。根据值的已知生命周期 分配存储空间。如果已知该值是短期的,则将其存储分配到短期池中。如果该值不是已知是短期的,则必须将其分配到长期池中。
名单拥有的1、2、3可以长生不老;我们不知道该列表是否会超过当前激活帧。因此存储1、2、3的内存分配在长期池上。
不要相信“值类型总是在栈上分配”的谎言。显然,这不可能是真的,因为包含数字的类或数组无法在当前堆栈帧中存活下来!值类型分配在对其已知生命周期有意义的池中。
List<int>
can scale its size to any size at runtime unlikeint[]
正确。看看如何List<T>
很有教育意义这样做。它只是简单地分配了一个比它需要的更大的 T 数组。如果它发现它猜的太小,它会分配一个新的、更大的数组,并将旧数组的内容复制到新数组中。 List<T>
只是一堆数组副本的方便包装器!
if the values 1,2,3 were stored in stack, and a new item 4 is added to the list, then it wouldn't be continuous to the first three.
正确。这就是为什么没有在堆栈上分配值 1、2、3 的存储空间的原因之一。存储实际上是分配在堆上的一个数组。
so how will the list know the memory location of item 4?
列表分配的数组太大。当您添加一个新项目时,它会将其粘贴到太大数组中未使用的空间中。当数组空间不足时,它会分配一个新数组。
关于c# - 泛型内存管理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8678795/
我是一名优秀的程序员,十分优秀!