流的内容和返回的字符串“str()”之间的差异
Difference between content of stream and the string `str()` returns?
我使用的是一小段生成PDF文件的代码,我在互联网上找到了它,并试图(温和地)优化它,因为创建文件需要很长时间。在分析之后,我将其缩小为以下代码:
std::ostringstream tmp;
tmp << std::hex << std::uppercase << std::setfill('0') <<
std::setw(2) << r << " " <<
std::setw(2) << g << " " <<
std::setw(2) << b;
out << tmp.str();
在一个紧密的循环中发现,out
是一个ostringstream
,它在写入文件之前基本上包含了整个PDF内容。我发现tmp.str()
是该循环中花费最多时间的一行,并且在查找C++引用时发现str()
将返回流的底层字符串的副本。
然后,我认为删除该副本并直接使用out
会更快。所以我抛弃了tmp
,直接做了:
out << std::hex << std::uppercase << std::setfill('0') <<
std::setw(2) << r << " " <<
std::setw(2) << g << " " <<
std::setw(2) << b;
但现在,生成的PDF文件被认为是"损坏的",PDF阅读器无法打开,而上一个可能是。我用这两种方法创建了一个PDF(有tmp
流和没有)来比较输出的行,但没有发现明显的差异。。。
那么,这可能是什么原因呢?有理由使用那个临时流吗?是吗?为什么它与直接使用out
流不同?
我认为它可能与换行符或操纵器有关,但在这些上找不到任何重要的东西
需要考虑的是,io操纵器(例如std::hex
)在流上从该点向前是持久的。
因此,一旦插入std::hex
操纵器,所有积分值都将从此点开始以十六进制格式打印出来。
您以前的方法没有这个问题,因为操纵器在瞬态流上。完成后,您可以尝试插入std::dec
操纵器。。。
根据Jan Hudec的评论,Boost IO State Savers是干净处理这一问题的好方法。
另一个小区别是:如果std::ostringstream的格式化输出失败,则目标输出不会受到影响。
(尼姆的回答描述了实际问题)
相关文章:
- C++中std::resize(n)和std::shrink_to_fit之间的区别
- int(c) 和 c-'0' 之间的区别。C++
- 在cuda线程之间共享大量常量数据
- 在c代码之间共享数据的最佳方式
- Mix_Init和Mix_OpenAudio SDL之间的区别是什么
- C++ 使用 assign 函数的字符串与直接使用 '=' 更改值的字符串之间的区别
- VSOMEIP-2个设备之间的通信(TCP/UDP)不工作
- std::atomic和std::condition_variable wait,notify_*方法之间的区别
- 大小相等但成员数量不同的结构之间的性能差异
- 类与私有变量的其他类之间的线程安全性
- 如何在cpp文件之间切换窗口?在Qt中
- 线程之间的布尔停止信号
- str.clear() 和 str 之间的区别 = " "
- 初始化 stringstream.str( a_value ) 和 stringstream << a_value 之间的区别
- 流的内容和返回的字符串“str()”之间的差异
- sizeof(str-1)和sizeof(str)-1之间的差异
- << s.str() 和 << s.rdbuf() 之间的区别
- *str[] 和 str[][] 之间的区别
- "str" 和常量字符之间的 c++ 重载[N]?
- CW2A(LPCWSTR)str)和CW2A(LPCWSTR)str, CP_UTF8)之间的区别是什么?