【问题标题】:Writing a C# string to a preallocated unmanaged buffer using UTF8 encoding使用 UTF8 编码将 C# 字符串写入预分配的非托管缓冲区
【发布时间】:2012-01-31 19:56:00
【问题描述】:

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

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

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

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

【问题讨论】:

  • 你有什么理由不能用 C++ 写这个吗?
  • 如果我想避免过渡,使用 C++ 没有区别
  • 如果你用 C++/CLR 写的话就没有过渡了。
  • 不是真的。在 C# 中编写不安全的代码将呈现与 C++/CLR 相同的结果。如果我包含无法使用 IL 生成的 C++ 代码,C++/CLR 编译器将添加一个转换以访问幕后的本机函数。如果 C++ 代码可以使用 IL 呈现,那么它将是(这避免了转换)。这意味着与不安全的 C# 相比,C++/CLR 没有任何收获,因为它们都生成相同的 IL。没有转换的唯一区别是 C++ 语法优于不安全的 C# 语法。

标签: c# utf-8 clr unmanaged unmanaged-memory


【解决方案1】:

使用不安全的重载

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

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

【讨论】:

  • 我不明白为什么人们在没有给出解释的情况下投反对票。即使是简短的一句话评论也会很有帮助。
  • 我不明白为什么这被否决了。您需要指定指向字符串的指针和将接收字符的字节缓冲区。它会将 UTF-8 字符复制到其中。
  • 也许是为了简洁。正如我现在已经充实了答案,反对票已经过时,应该恢复。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-23
  • 1970-01-01
  • 2019-07-29
  • 2013-12-22
相关资源
最近更新 更多