gpt4 book ai didi

c++ - 具有直接输出缓冲区/字符串结果访问的 std::stringstream,避免复制?

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:43:33 42 4
gpt4 key购买 nike

是否有 std::stringstream 的规范/公共(public)/免费实现变体,我每次调用 时都不需要为完整的字符串拷贝付费海峡()? (可能通过在 osteam 类中提供直接的 c_str() 成员?)

我在这里发现了两个问题:

“当然”还有已弃用的 std::strstream类确实允许直接缓冲区访问,尽管它的接口(interface)真的很古怪(除了它被弃用之外)。

似乎也可以找到several代码 samples这确实解释了如何自定义 std::streambuf 以允许直接访问缓冲区——我没有在实践中尝试过,但它似乎很容易实现。

我的问题这里实际上有两个方面:

  • std::[o]stringstream是否有更深层次的原因? (或者更确切地说,basic_stringbuf)是否不允许直接访问缓冲区,而只能通过整个缓冲区的(昂贵的)拷贝访问?
  • 鉴于这看起来很容易,但实现起来并非微不足道,是否有任何可通过 boost 或其他来源提供的 varaint 来封装此功能?

注意:str() 制作的拷贝的性能损失是非常可衡量的(*),所以在使用时必须为此付费似乎很奇怪到目前为止,看到的情况确实从不需要从字符串流返回的拷贝。 (如果我需要一份拷贝,我总是可以在“客户端”制作它。)


(*):使用我们的平台(VS 2005),我在发布版本中测量的结果是:

// tested in a tight loop:

// variant stream: run time : 100%
std::stringstream msg;
msg << "Error " << GetDetailedErrorMsg() << " while testing!";
DoLogErrorMsg(msg.str().c_str());

// variant string: run time: *** 60% ***
std::string msg;
((msg += "Error ") += GetDetailedErrorMsg()) += " while testing!";
DoLogErrorMsg(msg.c_str());

因此,将 std::string+= 一起使用(这显然仅在我不需要自定义/数字格式时才有效,比流版本快 40% ,据我所知,这只是由于 str() 制作的完全多余的拷贝。

最佳答案

我将尝试为我的第一个项目符号提供答案,

Is there any deeper reason why std::ostringstream does not allow direct buffer access

查看 streambuf/stringbuf被定义,我们可以看到缓冲区字符序列不是NULL终止的

据我所知,一个(假设的)const char* std::ostringstream::c_str() const; 函数,提供直接的只读缓冲区访问,只有在以下情况下才有意义有效的缓冲区范围将始终以 NULL 终止——即(我认为)当 sputc 时将始终确保它在插入的字符后插入一个终止 NULL。

我不认为这本身是技术障碍,但考虑到 basic_streambuf 的复杂性接口(interface),我完全不确定它是否在所有情况下都是正确的。

关于c++ - 具有直接输出缓冲区/字符串结果访问的 std::stringstream,避免复制?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22078543/

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