gpt4 book ai didi

c# - 泛型内存管理

转载 作者:太空狗 更新时间:2023-10-29 18:01:23 25 4
gpt4 key购买 nike

我对如何为强类型泛型管理内存有疑问

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 unlike int[]

正确。看看如何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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com