gpt4 book ai didi

c++ - C++ 中的字符串生产者/消费者:std::deque 或 std::stringstream?

转载 作者:塔克拉玛干 更新时间:2023-11-03 06:53:56 24 4
gpt4 key购买 nike

在我们的应用程序中,我们有一个生成字符的类,另一个使用字符的类。当前的实现在字符生成时动态分配字符(使用 new)并在字符被使用时删除它们(使用 delete)。这一切都非常缓慢,我正在寻找替换该实现以提高其性能的方法。

我需要的语义是标准类 queue 的语义:在前面压入,在后面弹出。默认实现使用 deque IIRC。 deque 通常使用“ block ”或“ block ”内存实现,因此我预计对操作系统内存分配器的调用会少得多,并且速度会显着提高,而额外的内存使用量很少。

但是,由于排队的数据是字符(可能是宽字符),替代方法是使用标准输入/输出流类,即字符流 stringstream。据我所知,他们的行为也很像队列。

是否有更好的先验选择?两个类(class)会有相似的分配模式吗?我可以尝试衡量两者的性能,但也许这并不重要,任何一个都足够好。在那种情况下,哪种使用起来最简单/最安全?

次要问题是生产者和消费者之间的并发。我可以将访问限制为顺序访问(在同一线程上),但是线程安全的实现可能对当前的多核硬件在性能方面有益。

在我开始编写代码之前感谢您的智慧。

最佳答案

std::stringstream 不是队列,因为读取字符不会消耗它们。您可以简单地 seekg(0) 并重新读取相同的字符。因此,您写入的内容越多,消耗的内存就越多。

坚持使用 std::queuestd::deque 作为底层实现的默认选择几乎可以肯定是正确的。

关于并发性,当任何其他线程正在读取或写入它时写入 std::queue 绝对是不安全的。如果您想要一个高效的阻塞队列实现,您必须编写或借用一个专门为此目的构建的。

关于c++ - C++ 中的字符串生产者/消费者:std::deque<char> 或 std::stringstream?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12700563/

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