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以进行分配?

谢谢!

stackalloc (C# Reference)

有没有删除[]的free以进行分配?

是的,什么都不做。由于它的堆栈已分配,一旦方法返回,它将立即被删除(您提到的delete[]表明您在与C++进行类比,但请注意,在C++中,您没有delete[]堆栈分配的变量)。

不过,您不会走那么远,因为您的堆栈分配太多了。

CCD_ 3的用途非常有限。它往往比只使用堆内存慢,除非您将其用作fixed的替代方案,或者在少数情况下,不同的线程允许同时分配大数组。它只适用于在外部使用小于几千字节的数组。

使用堆数组会更好。使用指针和fixed可能会更好,也可能不会更好。

将文档分块进行解析会更好。如果可能的话,只在4kiB或8kiB的中等大小的段中从流中加载它们,并处理每个这样的块。

我认为没有删除方法。这是一个堆栈,你可以在上面添加一些东西,也可以从上面删除一些东西。不能从堆栈中间移除东西。当方法返回时,分配的内存将自动释放。我认为当传入的字符串很长时会发生stackoverflow。将堆内存用于此任务。只需创建一个新数组。