如何使用 UWP Platform::StringReference

How to use UWP Platform::StringReference

看来我的代码在下面的方法中做了很多new/delete将C字符串转换为Platform::String(每半秒做一次,文本大约100-200KB由第三方 C 代码累积)

String^ ToPlatformString(const char* str)
{
    if (str == nullptr)
        return nullptr;

    auto length = strlen(str);
    wchar_t * wcstr = new wchar_t[length + 1];
    size_t num_converted = 0;
    mbstowcs_s(&num_converted, wcstr, length + 1, str, _TRUNCATE);

    auto res = ref new String(wstr);
    delete[] wstr;
    return res;
}

我知道在内部,Platform::String 构造函数基本上为传递的字符串 wstr 创建了一个新副本。有没有办法消除这种冗余?请注意,我还希望 Platform::String 实例在被销毁时释放分配的数据。

如您的标题所示,最好的选择是 StringReference built-in 类型。 class 这里有很好的文档:

https://docs.microsoft.com/en-us/cpp/cppcx/strings-c-cx#stringreference

您能否成功使用此方法在很大程度上取决于您的使用模式,主要是由于 StringReference 的两个限制:

  1. 未对引用计数 - 常规 C++ object,用于堆栈分配。
  2. 在不影响性能的情况下,只允许 assignment/conversion 到 String^ - 第二次分配将触发复制。

所以你可以逃避这样的事情:

void UseAsPlatformString(wchar_t *wcstr)
{
    Platform::StringReference ref(wcstr);
    AFunction(ref.GetString());     // GetString() not required, shown for clarity.
}

void AFunction(Platform::String ^arg)
{
   // Do something with arg.
   // Don't do this:
   //   Platform::String ^ref2 = arg;
}

您要调用的函数需要直接作用于 passed-in 字符串,而不是对该字符串进行其他引用,这会使引用计数超过 1。我的理解是,如果计数超过1,然后会复制一份