其他分享
首页 > 其他分享> > c – 具有单个副本的Init std :: string

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