如何使用UWP Platform :: StringReference

时间:2018-01-28 19:12:50

标签: uwp c++-cx

似乎我的代码在以下方法中执行了很多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实例释放已分配的数据。

1 个答案:

答案 0 :(得分:0)

正如您的标题所示,您最好的选择是StringReference内置类型。这里有很好的文档记录:

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

使用此方法的成功将取决于您的使用模式,主要是由于StringReference的两个限制:

  1. 未引用计数 - 常规C ++对象,用于堆栈分配。
  2. 只允许一个赋值/转换为String ^而不会触及性能 - 第二次分配将触发副本。
  3. 所以你可以逃避这样的事情:

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

    你想要调用什么函数需要直接对传入的字符串进行操作,ad不要对字符串进行其他引用,这会将引用计数推到1以上。我的理解是,如果计数超过1,那么a将复制。