JBL*_*JBL 6 c++ string stringstream
我正在使用一小段生成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();
Run Code Online (Sandbox Code Playgroud)
在一个紧密的循环中发现,与out作为一个ostringstream之前它写入文件,基本上包含整个PDF内容.我发现那tmp.str()是在该循环中花费最多时间的行,并且在查找str()将返回流的底层字符串的C++引用时看到了.
然后,我想删除该副本并直接使用out会更快.所以我倾倒tmp并直接做了:
out << std::hex << std::uppercase << std::setfill('0') <<
std::setw(2) << r << " " <<
std::setw(2) << g << " " <<
std::setw(2) << b;
Run Code Online (Sandbox Code Playgroud)
但现在,生成的PDF文件被视为"已损坏",无法通过PDF阅读器打开,而前一个可能是.我使用两种方法(使用tmp流和没有)创建PDF 来比较行输出,但没有发现明显的差异......
那么,这可能是什么原因呢?是否有理由使用该临时流?是的,为什么它可能与直接使用out流不同?
我认为它可能与换行或操纵器有关,但在这些上找不到任何重要的东西
Nim*_*Nim 10
要考虑的是,io操纵器(例如std::hex)从流上的那一点开始是持久的.
因此,一旦插入std::hex操纵器,从此时开始,所有积分值都以十六进制格式打印出来.
由于操纵器处于瞬态流,因此您之前的方法没有出现此问题.std::dec一旦完成,你可以尝试插入操纵器......
从Jan Hudec的评论中提出,Boost IO State Savers是一个很好的方式来处理这个问题.
| 归档时间: |
|
| 查看次数: |
632 次 |
| 最近记录: |