【问题标题】:Can .Net String be handed to fn(const char16_t* str) w/o copying?.Net String 可以交给 fn(const char16_t* str) 没有复制吗?
【发布时间】:2019-01-30 06:09:43
【问题描述】:

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

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

这可能吗?在什么情况下从性能角度来说值得(我相信固定对象不是免费的)?

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

编辑 这个问题几乎是重复的,所以我暂时删除了它。但它与另一个问题并不完全重复,它询问以const wchar_t* 访问数据,而我需要的是const char16_t*

【问题讨论】:

  • 您想通过将字符串传递给本机 dll 来从 .Net 代码中调用 c++ .dll 中的函数吗?
  • @xMRi 差不多。我删除了这个问题,但后来决定取消删除它,因为您的链接转换为const wchar_t*,这意味着,我们还没有,没有reinterpret_cast
  • 由于数据在内部存储为 wchar_t ,因此无法将其用作普通的 char* 数组,而无需复制它!您可以使用 char* 但每个 char 始终有 2 个字节...
  • @xMRi 你看到我的回答了吗?我实际上就是这样使用它的。

标签: c++ c++-cli


【解决方案1】:

是的,可以做到。

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);
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-01-25
    • 2017-04-27
    • 2010-12-29
    • 2019-12-29
    • 2015-01-15
    • 2010-09-23
    • 1970-01-01
    相关资源
    最近更新 更多