【发布时间】:2015-10-29 16:05:49
【问题描述】:
我的意思是真的有可能吗? MSDN 说数组是固定大小的,调整大小的唯一方法是“复制到新位置”。但也许内部 CLR 结构的不安全/一些魔法是可能的,它们都是用 C++ 编写的,我们有一个完整的内存控制,可以调用 realloc 等等。
我没有为这个问题提供代码,因为我什至不知道它是否存在。
我不是在谈论 Array.Resize 方法等,因为它们显然没有所需的行为。
假设我们有一个带有 2GB 内存的标准 x86 进程,而我有 1.9GB 由单个数组填充。然后我想释放一半。所以我想写这样的东西:
MagicClass.ResizeArray(ref arr, n)
并且不要得到 OutOfMemoryException。 Array.Resize 将尝试分配另一 GB 的 RAM,但会因 1.9+1 > 2GB OutOfMemory 而失败。
【问题讨论】:
-
你可以声明一个像下面
var someArray = {}这样的数组然后例如如果你想在运行时加载它并且不知道你可以这样做的潜在大小..var someList = new List{"apple", "orange", "pears"};然后加载像这样的数组someArray = someList.ToArray(); -
Array.Resize(ref yourArray, newCount); -
问题是,您实际上并没有询问您遇到的问题。这使得问题变得相当琐碎,答案可能会错过你的分数。 为什么要截断数组?在什么样的情况下你想要这个,尝试进行就地截断的原因是什么?想要保留内存的每一个小字节?让复制发生——这就是 .NET 的设计目的。想要在更改数组大小的同时避免昂贵的副本?使用一个列表,并好好使用它——如果它不适合你,甚至可以自己编写。
标签: c# c++ .net arrays memory-management