【问题标题】:Does a FIFO std::queue<std::string> excessively copy large strings?FIFO std::queue<std::string> 是否过度复制大字符串?
【发布时间】:2021-09-29 09:26:18
【问题描述】:

我正在实现一个简单的生产者线程和消费者线程,它使用共享的std::queue&lt;std::string&gt; 将很长的字符串从生产者传递给消费者,在添加/删除队列时锁定互斥锁。

我的主要不确定性是我不确定队列是如何管理字符串的。除了最初插入队列的时间之外,整个字符串是否在其生命周期内都在队列中被复制?

【问题讨论】:

    标签: c++ string performance stl queue


    【解决方案1】:

    简短的回答是否定的。除非您使用相当旧的编译器,否则它们在队列中时可能根本不会被复制。

    默认情况下,std::queue 使用std::deque 作为其底层存储。与(例如)std::vector 不同,std::deque 通常不使用连续存储。相反,它是一个指针向量,其中每个指针都指向正在存储的固定大小的项目块。当您将项目添加到双端队列时,它根本不会复制包含实际项目的那些块。相反,它只是分配另一个固定大小的块,并将其地址添加到指针向量中。

    因此,至少在deque 的通常实现中(因此queue,至少在默认情况下),从推送到弹出的时间,项目在内存中保持完全相同的位置.

    但还要注意,即使您将项目存储在 vector 之类的东西中,可以将项目从一个内存块移动到另一个内存块,它通常不会导致问题,除非(可能)在相当旧的编译器上( C++-11 之前)。从 C++11 开始,项目可以移动而不是复制。当您移动一个长字符串时,您将复制一些簿记项(指向数据的指针、分配的当前大小、当前使用的大小),但长字符串的实际数据将不会复制。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-06-06
      • 1970-01-01
      • 2014-08-22
      • 2012-02-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多