使用std :: string与C风格API交互时,是否可以避免使用临时缓冲区?

时间:2011-10-14 09:36:59

标签: c++ c

我应该在这个问题前面说我认为答案可能不是,但我想看看其他人对这个问题的看法。

我花了大部分时间编写与Win32 API交互的C ++,就像大多数C风格的API想要的那样:

  1. 拿走我提供的缓冲液并对其进行操作。
  2. 或返回缓冲区的指针,我需要稍后释放。
  3. 这两种情况本质上都意味着如果你想在你的代码中使用std::string,你必须接受这样一个事实:你每次构造一个{时都会进行大量的字符串复制来自临时缓冲区的{1}}。

    最好的是:

    1. 能够允许C样式API安全地直接改变std::string并预先保留其分配并提前设置其大小(以缓解方案1)
    2. 能够围绕现有std::string包裹std::string(以缓解方案2)
    3. 有没有一种很好的方法来做其中任何一种,或者我是否应该接受将char[]与旧学校API一起使用的固有成本?看起来情况1看起来特别棘手,因为std::string有一个短的字符串优化,因此它的缓冲区可以在堆栈或堆上,具体取决于它的大小。

4 个答案:

答案 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*并且很可能工作。与所有优化一样,确保实际上代码的这一部分是瓶颈。如果是,请将其包装在内联函数或模板类中,以便您可以为它编写一些测试,如果在某个平台上不起作用则更改行为。