繁体   English   中英

FIFO std::queue<std::string> 过度复制大字符串?

[英]Does a FIFO std::queue<std::string> excessively copy large strings?

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

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM