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

马丁·巴

是否存在规范/公共/免费实现的变体std::stringstream其中我每次致电都不为完整的字符串副本付费str()(可能是通过c_str()在osteam类中提供直接成员吗?)

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

并且“当然”,不推荐使用的std::strstream类确实允许直接缓冲区访问,尽管它的接口确实很古怪(除了不推荐使用)。

似乎还可以找到几个代码示例,这些示例确实说明了如何自定义std::streambuf以允许直接访问缓冲区-我在实践中还没有尝试过,但是似乎很容易实现。

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

  • 有什么更深层的原因为什么std::[o]stringstream(或更确切地说,basic_stringbuf不允许直接缓冲区访问,而仅允许通过整个缓冲区的(昂贵的)副本进行访问?
  • 鉴于似乎很容易实现,但非易事,是否可以通过boost或其他来源获得任何变种,所以打包了此功能?

注:副本的表现打的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::stringwith +=(显然仅在不需要自定义/数字格式的情况下才有效,它比流版本快40%,据我所知,这仅是因为制作了完整的多余副本str()

马丁·巴

至于第二弹

鉴于似乎很容易实现,但并非易事,是否可以通过boost或其他来源使用任何变体来打包此功能?

还有就是 了Boost.Iostreams,它甚至包含了一个例子如何实现的(O)用字符串流接收器。

我提出了一些测试实现来对其进行度量:

#include <string>
#include <boost/iostreams/stream.hpp>
#include <libs/iostreams/example/container_device.hpp> // container_sink

namespace io = boost::iostreams;
namespace ex = boost::iostreams::example;
typedef ex::container_sink<std::wstring> wstring_sink;
struct my_boost_ostr : public io::stream<wstring_sink> {
    typedef io::stream<wstring_sink> BaseT;
    std::wstring result;
    my_boost_ostr() : BaseT(result)
    { }

    // Note: This is non-const for flush.
    // Suboptimal, but OK for this test.
    const wchar_t* c_str() {
        flush();
        return result.c_str();
    }
};

在我所做的测试中,将其与c_str()辅助程序一起使用的速度比ostringstream其复制str().c_str()版本的普通工具快一些

我不包括测量代码。该区域的性能非常脆弱,请确保自己衡量用例!(例如,字符串流的构造函数开销不可忽略。)

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

gsub!复制字符串的缓冲区?

来自分类Dev

std :: cin:清空输入缓冲区而不会阻塞

来自分类Dev

是否通过std :: wostream定义了char *字符串的输出?

来自分类Dev

将元素推入std :: queue时避免复制

来自分类Dev

在C ++ 11中是否正在对&str [0]缓冲区(具有std:string的字符串)进行明确定义的行为?

来自分类Dev

C ++使用std :: string,std :: wstring作为缓冲区

来自分类Dev

将缓冲区或C字符串复制到std :: string的最快方法

来自分类Dev

如何保存和恢复std :: istringstream的缓冲区?

来自分类Dev

如何将部分char缓冲区复制到std :: string?

来自分类Dev

如何使用std :: hash哈希缓冲区?

来自分类Dev

在私有std :: string继承上访问字符串

来自分类Dev

将字符缓冲区传递到std :: string()后是否需要释放它?

来自分类Dev

从std :: vector的缓冲区CV :: imwrite

来自分类Dev

std :: vector <std :: vector <int >> push_back导致堆缓冲区溢出

来自分类Dev

直接写入std :: string的char *缓冲区

来自分类Dev

在std :: string :: end()和std :: string :: capacity()之间使用缓冲区

来自分类Dev

gsub!复制字符串的缓冲区?

来自分类Dev

直接写入std :: strings缓冲区是否安全?

来自分类Dev

std :: cin:清空输入缓冲区而不会阻塞

来自分类Dev

将元素推入std :: queue时避免复制

来自分类Dev

std :: stringstream缓冲区操作

来自分类Dev

将缓冲区或C字符串复制到std :: string的最快方法

来自分类Dev

如何保存和恢复std :: istringstream的缓冲区?

来自分类Dev

如何将部分char缓冲区复制到std :: string?

来自分类Dev

用std :: copy复制缓冲区

来自分类Dev

缓冲区到字符串?

来自分类Dev

如何使用 std::copy() 复制到指向通用字节缓冲区开头的指针?

来自分类Dev

使用 std::cin.getline() 后如何保留 std::cin 的缓冲区

来自分类Dev

我可以循环直到 `std::cin` 在输入缓冲区中看到 `\n` 字符吗?

Related 相关文章

  1. 1

    gsub!复制字符串的缓冲区?

  2. 2

    std :: cin:清空输入缓冲区而不会阻塞

  3. 3

    是否通过std :: wostream定义了char *字符串的输出?

  4. 4

    将元素推入std :: queue时避免复制

  5. 5

    在C ++ 11中是否正在对&str [0]缓冲区(具有std:string的字符串)进行明确定义的行为?

  6. 6

    C ++使用std :: string,std :: wstring作为缓冲区

  7. 7

    将缓冲区或C字符串复制到std :: string的最快方法

  8. 8

    如何保存和恢复std :: istringstream的缓冲区?

  9. 9

    如何将部分char缓冲区复制到std :: string?

  10. 10

    如何使用std :: hash哈希缓冲区?

  11. 11

    在私有std :: string继承上访问字符串

  12. 12

    将字符缓冲区传递到std :: string()后是否需要释放它?

  13. 13

    从std :: vector的缓冲区CV :: imwrite

  14. 14

    std :: vector <std :: vector <int >> push_back导致堆缓冲区溢出

  15. 15

    直接写入std :: string的char *缓冲区

  16. 16

    在std :: string :: end()和std :: string :: capacity()之间使用缓冲区

  17. 17

    gsub!复制字符串的缓冲区?

  18. 18

    直接写入std :: strings缓冲区是否安全?

  19. 19

    std :: cin:清空输入缓冲区而不会阻塞

  20. 20

    将元素推入std :: queue时避免复制

  21. 21

    std :: stringstream缓冲区操作

  22. 22

    将缓冲区或C字符串复制到std :: string的最快方法

  23. 23

    如何保存和恢复std :: istringstream的缓冲区?

  24. 24

    如何将部分char缓冲区复制到std :: string?

  25. 25

    用std :: copy复制缓冲区

  26. 26

    缓冲区到字符串?

  27. 27

    如何使用 std::copy() 复制到指向通用字节缓冲区开头的指针?

  28. 28

    使用 std::cin.getline() 后如何保留 std::cin 的缓冲区

  29. 29

    我可以循环直到 `std::cin` 在输入缓冲区中看到 `\n` 字符吗?

热门标签

归档