如何使用 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 的两个限制:
- 未对引用计数 - 常规 C++ object,用于堆栈分配。
- 在不影响性能的情况下,只允许 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,然后会复制一份
看来我的代码在下面的方法中做了很多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 的两个限制:
- 未对引用计数 - 常规 C++ object,用于堆栈分配。
- 在不影响性能的情况下,只允许 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,然后会复制一份