c – 具有单个副本的Init std :: string
作者:互联网
我在Win32上的C中有以下代码.它只是一些返回CHAR *的Win32 API的C扭曲:
wstring expandEnvironmentVariables(const wstring & str)
{
DWORD neededSize = ExpandEnvironmentStrings(str.c_str(), nullptr, 0);
vector<WCHAR> expandedStr(neededSize);
if (0 == ExpandEnvironmentStrings(str.c_str(), expandedStr.data(), static_cast<DWORD>(expandedStr.size()))) {
return wstring(str);
}
return wstring(expandedStr.data());
}
让我对这段代码感到困扰的是结果的双重副本.
>通过API成为WCHAR的向量.
>从矢量到std :: wstring.
有没有办法只用一个副本来实现这个代码,并且没有对函数签名进行重大更改.
这是一个具体的例子,但我对使用std :: wstring / std :: string的一般解决方案和正确方法更感兴趣,因为这种模式在代码中的许多地方都显示出来.
解决方法:
关于C端,您可以直接使用wstring作为结果变量.
要获得指向非零大小的wstring的缓冲区的指针,只需使用& s [0].
就像std :: vector一样,std :: basic_string有一个保证连续的缓冲区.
对于返回,它可能会获得返回值优化(RVO),如果没有,那么它将被移动.
免责声明:我还没有查看API函数的文档.我不知道这段代码是否正确甚至有意义.我只是假设.
标签:c,c11,stdstring 来源: https://codeday.me/bug/20190824/1707616.html