将字符串复制到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#中的内存缓冲区
基础教程推荐
- unity实现简单贪吃蛇游戏 2023-02-16
- C#的this关键字的2种用法 2023-05-06
- Unity3D UGUI特效之Image高斯模糊效果 2023-01-16
- Unity3D实现扭动挤压浏览效果 2023-01-16
- Unity shader实现高斯模糊效果 2023-01-16
- c# – 从外部域(AWS S3)加载映像并将其存储在浏览器内存中 2023-09-19
- c# – 如何从IEnumerable集合中将对象添加到数据库? 2023-11-22
- C# 使用PrintDocument类打印标签的方法 2023-05-31
- WPF自定义控件的实现 2023-07-18
- C# 操作Windows注册表的实现方法 2023-05-26