stackalloc (C# Reference)
本文关键字:Reference stackalloc | 更新日期: 2023-09-27 18:25:28
我正在尝试解析130000个文档,并且我正在尽可能快地完成这项工作。
此函数用于删除Document中的分隔符char。
public static unsafe string StripRestAndNewlines(string s)
{
int len = s.Length;
char* newChars = stackalloc char[len];
char* currentChar = newChars;
for (int i = 0; i < len; ++i)
{
char c = s[i];
switch (c)
{
case ',':
case '.':
case ':':
case ';':
case '-':
case '>':
case '<':
case '/':
case '''':
case '?':
case '"':
case '*':
case '&':
case '_':
case '+':
case '@':
case '[':
case ']':
case '!':
case '=':
case '%':
case '#':
continue;
default:
*currentChar++ = c;
break;
}
}
return new string(newChars, 0, (int)(currentChar - newChars));
}
但在运行程序2分钟后停止,我得到了
system.StackOverflow异常
有没有删除[]的free以进行分配?
谢谢!
有没有删除[]的free以进行分配?
是的,什么都不做。由于它的堆栈已分配,一旦方法返回,它将立即被删除(您提到的delete[]
表明您在与C++进行类比,但请注意,在C++中,您没有delete[]
堆栈分配的变量)。
不过,您不会走那么远,因为您的堆栈分配太多了。
CCD_ 3的用途非常有限。它往往比只使用堆内存慢,除非您将其用作fixed
的替代方案,或者在少数情况下,不同的线程允许同时分配大数组。它只适用于在外部使用小于几千字节的数组。
使用堆数组会更好。使用指针和fixed
可能会更好,也可能不会更好。
将文档分块进行解析会更好。如果可能的话,只在4kiB或8kiB的中等大小的段中从流中加载它们,并处理每个这样的块。
我认为没有删除方法。这是一个堆栈,你可以在上面添加一些东西,也可以从上面删除一些东西。不能从堆栈中间移除东西。当方法返回时,分配的内存将自动释放。我认为当传入的字符串很长时会发生stackoverflow。将堆内存用于此任务。只需创建一个新数组。