gpt4 book ai didi

c++ - 在使用 std::string 与 C 风格的 API 交互时,你能避免使用临时缓冲区吗?

转载 作者:可可西里 更新时间:2023-11-01 17:39:33 25 4
gpt4 key购买 nike

我应该在这个问题的开头说我认为答案可能是否定的,但我想看看其他人对这个问题的看法。

我大部分时间都在编写与 Win32 API 交互的 C++,就像大多数 C 风格的 API 一样:

  1. 获取我提供的缓冲区并对其进行操作。
  2. 或者返回指向我稍后需要释放的缓冲区的指针。

这两种情况本质上意味着,如果您想在代码中使用 std::string,您必须接受这样一个事实,即您将进行大量的字符串复制每次从临时缓冲区构造 std::string 时。

最好是:

  1. 能够允许 C 风格的 API 安全地直接改变 std::string 并预先保留其分配并提前设置其大小(以缓解场景 1)
  2. 能够将 std::string 包裹在现有的 char[] 中(以缓解场景 2)

有没有一种好的方法可以做到这些,或者我是否应该接受将 std::string 与旧式 API 一起使用会产生固有成本?看起来场景 1 会特别棘手,因为 std::string 有一个短字符串优化,它的缓冲区可以在堆栈上或堆上,具体取决于它的大小。

最佳答案

在 C++11 中,您可以简单地将指针传递给字符串的第一个元素 (&str[0]):它的元素保证是连续的。

以前,您可以使用 .data().c_str() 但字符串不能通过它们改变。

否则,是的,您必须执行复制。但我不会太担心这个,直到分析表明这对您来说确实是个问题。

关于c++ - 在使用 std::string 与 C 风格的 API 交互时,你能避免使用临时缓冲区吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7765750/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com