将字符串复制到C#中的内存缓冲区

将字符串复制到C#中的原始内存缓冲区的最佳方法是什么?请注意,我已经知道如何以及何时使用String和StringBuilder,所以不建议使用;)-我将需要一些文本处理和功能.呈现代码,并且目前看来,只要我可以将数据放入其中,内...

将字符串复制到C#中的原始内存缓冲区的最佳方法是什么?

请注意,我已经知道如何以及何时使用String和StringBuilder,所以不建议使用;)-我将需要一些文本处理和功能.呈现代码,并且目前看来,只要我可以将数据放入其中,内存缓冲区就更易于编写且性能更高. (我正在考虑使用B树编辑器缓冲区和内存映射文件,这些文件无法很好地映射到托管C#对象中,但是很容易使用指针进行编码.)

我已经考虑过的事情:

> C/C++LI可以做到这一点,vcclr.h中有PtrToStringChars,然后可以将其传递给memcpy,但是我通常更喜欢只使用一个程序集并将IL与多种语言合并的方法.有什么办法可以用C#重写该函数吗?
> System.Runtime.InteropServices.Marshal具有复制字符串的功能,但仅复制到新分配的缓冲区中.找不到要复制到现有缓冲区的任何函数.
>我可以使用String.CopyTo并使用数组而不是内存缓冲区,但是然后我需要大量固定该缓冲区(或一直保持固定状态),这对GC不利. (通过首先使用内存缓冲区,我可以将其分配到托管堆之外,以免与GC混淆.)
>如果有固定或复制StringBuilder的方法,那也可能会起作用.我的文本通常来自文件或StringBuilder,因此,如果我那时已经可以将其移入内存缓冲区,则无需通过String实例. (请注意,从StringBuilder到String的性能无关紧要,因为如果以后再停止使用StringBuilder,此属性将被优化为不进行复制.)
>我可以生成固定String或StringBuilder的IL吗?然后,可以用发出所需的IL来生成DynamicMethod,而不是用C#编写复制函数.刚才在写问题时就想到了这一点,因此我可能只是尝试反汇编C/C++LI方式并重现IL.

解决方法:

启用不安全的代码(在项目选项中的某处),然后使用:

unsafe
{
    fixed(char* pc = myString)
    {
    }
}

然后只使用低级内存副本.

本文标题为:将字符串复制到C#中的内存缓冲区

基础教程推荐