gpt4 book ai didi

c++ - 流内容与返回字符串 `str()` 的区别?

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

我正在使用 a small piece of code生成我在互联网上找到的 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 阅读器打开,而以前的文件可以。我用两种方法(使用 tmp 流和不使用)创建了一个 PDF 来比较行输出,但没有发现明显的差异......

那么,这可能是什么原因呢?是否有理由使用该临时流?是吗,为什么它与直接使用 out 流不同?

我认为它可能与换行符或操纵器有关,但在这些方面找不到任何重要信息

最佳答案

需要考虑的是 io 操纵符(例如 std::hex)从流中的那一点开始是持久的。

因此,一旦您插入 std::hex 操纵器,所有整数值都将以十六进制格式打印出来。

您之前的方法没有这个问题,因为操纵器处于 transient 流中。完成后,您可以尝试插入 std::dec 操纵器...

摘自 Jan Hudec 的评论,Boost IO State Savers是干净地处理这个问题的好方法。

关于c++ - 流内容与返回字符串 `str()` 的区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20473728/

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