2

我需要将 C# 字符串写入编码为 Utf8 的预分配非托管缓冲区。回答之前,请阅读以下要求

  • 没有新的分配(所以请不要让我回答涉及创建字节数组或其他实例化的问题)
  • 没有到非托管代码的转换(没有 pinvoke/calli)

目前,我正在使用 OpCodes.Cpblk 使用 16 位字符将原始字符串从 C# 复制到非托管缓冲区。这给了我与在 x64 架构上使用非托管 memcpy 大致相同的性能,我真的需要接近那个吞吐量。

我正在考虑将字符串固定char * 并对其进行迭代,但是在性能方面实现没有跳转表的编码器既麻烦又不理想。

4

1 回答 1

7

使用不安全的重载

public override unsafe int GetChars(byte* bytes, int byteCount, char* chars, int charCount)

UTF8Encoding 类的。您需要指定指向字符串的指针和将接收字符的字节缓冲区。它会将 UTF-8 字符复制到其中。不会发生分配,但需要不安全的代码。

于 2012-01-31T20:02:36.057 回答