.Net String可以交给fn(const char16_t* str) w/o复制吗?

Can .Net String be handed to fn(const char16_t* str) w/o copying?

我想使用接受 UTF16-LE 字符串作为 (const char16_t* str, size_t length) 参数的库函数。 length 参数只需要为非空终止的字符串提供。该函数将复制字符串并处理副本。

.Net 的字符串作为 UTF16 保存在内存中 - 假设它们以小端编码存储,应该能够固定字符串,获取内部指针并将其提供给这个库函数而无需额外的副本,因为图书馆无论如何都会复制它。

这可能吗,在什么情况下值得在性能方面这样做(我相信固定对象不是免费的)?

(这是一个基本上从 A 到 B 复制大量字符串的应用程序的最内层循环,复制部分是当前的瓶颈,因此加快速度是有意义的)。

编辑这个问题几乎是重复的,所以暂时删掉了。但这并不是另一个问题的重复,该问题询问如何以 const wchar_t* 访问数据,而我需要的是 const char16_t*.

是的,可以做到。

PtrToStringChars 允许我们访问内部 const wchar_t* 而无需复制。现在所需要的只是 reinterpret_castconst char16_t*:

void useStringInCLib(System::String^ s)
{
  pin_ptr<const wchar_t> wch = PtrToStringChars(s);
  const char16_t *chars = reinterpret_cast<const char16_t*>(wch);
  long charLen = s->Length;
  // long byteLen = charLen + charLen; // 2 byte wide characters
  use_it(chars, charLen);
}