【发布时间】: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