在c#中复制字符串到内存缓冲区

本文关键字:内存 缓冲区 字符串 复制 | 更新日期: 2023-09-27 18:15:22

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

请注意,我已经知道如何以及何时使用String和StringBuilder,所以不要建议;)-我将需要一些文本处理&目前看来,只要我能把数据放入内存缓冲区,它就更容易编码,性能也更高。(我正在考虑b树编辑器缓冲区和内存映射文件,这些文件不能很好地映射到托管c#对象,但很容易用指针编码。)

我已经考虑过的事情:

  • c++/CLI可以做这件事,vcclr.h中有PtrToStringChars,然后可以传递给内存,但我通常更喜欢只有一个汇编和合并来自多种语言的IL是我想避免的。有什么方法可以用c#重写这个函数吗?

  • System.Runtime.InteropServices。Marshal有复制字符串的函数,但只复制到新分配的缓冲区。

  • 我可以使用String。CopyTo并使用数组而不是内存缓冲区,但随后我需要固定该缓冲区很多(或保持它一直固定),这将不利于GC。(通过首先使用内存缓冲区,我可以在托管堆之外分配它,因此它不会与GC混淆。)

  • 如果有一种方法来固定或复制StringBuilder,那么这可能也会起作用。我的文本通常来自文件或StringBuilder,所以如果我已经可以将它移动到内存缓冲区中,那么它就不需要通过String实例。(请注意,从StringBuilder切换到String对性能没有影响,因为这是经过优化的,如果您之后停止使用StringBuilder,则不会复制。)

  • 我可以生成IL引脚字符串或StringBuilder?然后,而不是在c#中编写复制函数,我可以通过发出所需的IL来生成DynamicMethod。刚才在编写问题时想到了这一点,所以我可能只是尝试反汇编c++/CLI方式并重现IL。

在c#中复制字符串到内存缓冲区

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

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