我应该在这个问题前面说我认为答案可能不是,但我想看看其他人对这个问题的看法。
我花了大部分时间编写与Win32 API交互的C ++,就像大多数C风格的API想要的那样:
这两种情况本质上都意味着如果你想在你的代码中使用std::string
,你必须接受这样一个事实:你每次构造一个{时都会进行大量的字符串复制来自临时缓冲区的{1}}。
最好的是:
std::string
并预先保留其分配并提前设置其大小(以缓解方案1)std::string
包裹std::string
(以缓解方案2)有没有一种很好的方法来做其中任何一种,或者我是否应该接受将char[]
与旧学校API一起使用的固有成本?看起来情况1看起来特别棘手,因为std::string
有一个短的字符串优化,因此它的缓冲区可以在堆栈或堆上,具体取决于它的大小。
答案 0 :(得分:10)
在C ++ 11中,您只需将指针传递给字符串的第一个元素(&str[0]
):它的元素保证是连续的。
以前,您可以使用.data()
或.c_str()
,但这些字符串不可变。
否则,是的,您必须执行副本。但是我不会太担心这个,直到分析表明这对你来说真的是一个问题。
答案 1 :(得分:0)
您可以使用std::vector<char>
代替。你可以直接将指向第一个字符的指针传递给C代码,然后让C代码写下你不能用字符串做的代码。您可以在std::vector<char>
上对字符串执行的许多操作也是如此。
答案 2 :(得分:0)
我认为你可以安全地使用std ::(w)字符串这里做的唯一事情就是将它作为输入传递给用户不会被修改;使用.c_str()
获取指向(W)CHAR
的指针。
答案 3 :(得分:0)
那么你可以可能只是将字符串的.data()
const_cast char*
并且很可能工作。与所有优化一样,确保实际上代码的这一部分是瓶颈。如果是,请将其包装在内联函数或模板类中,以便您可以为它编写一些测试,如果在某个平台上不起作用则更改行为。