代码之家  ›  专栏  ›  技术社区  ›  Evgeniy Berezovsky

.NET字符串是否可以在不复制的情况下交给fn(const char16_t*str)?

  •  1
  • Evgeniy Berezovsky  · 技术社区  · 6 年前

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

    .NET的字符串以UTF16的形式保存在内存中-假设它们以小尾数编码存储,则应该能够固定字符串,获取内部指针,并在没有额外副本的情况下将其提供给此库函数,因为库无论如何都会复制它。

    这是可能的吗?在什么情况下,从性能角度来看,它值得(我相信,钉住一个物体是不自由的)?

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

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

    1 回复  |  直到 6 年前
        1
  •  -1
  •   Evgeniy Berezovsky    6 年前

    是的,可以。

    PtrToStringChars 允许我们访问内部 const wchar_t* 不复制。现在所需要的是 reinterpret_cast const 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);
    }
    
    推荐文章