提高std::vector<T>
的效率,它的底层数组需要预先分配,有时需要重新分配。然而,这需要创建和稍后 move 类型为 T
的对象。使用复制 ctor 或 move ctor。
我遇到的问题是 T
无法复制或 move ,因为它包含无法复制或 move 的对象(例如 atomic
和 mutex
)。 (而且,是的,我正在实现一个简单的线程池。)
我想避免使用指针,因为:
- 我不需要间接级别,所以我不想要。
- (指针效率较低并增加了复杂性。使用指针会增加内存碎片并减少数据局部性,这可能(但不一定必须)导致明显的性能影响。不是那么重要,但仍然值得考虑。)
有没有办法避免这里的间接级别?
更新:我根据评论和答案中的反馈修正了一些不正确的假设并重新表述了问题。
最佳答案
首先,std::mutex
无法复制或 move ,因此您不得不使用某种间接方式。
由于您想将互斥体存储在 vector 中,而不是复制它,我会使用 std::unique_ptr
.
vector<unique_ptr<T>>
does not allow certain vector operations (such as for_each)
我不确定我是否理解那句话。完全有可能做范围:
std::vector< std::unique_ptr< int > > v;
// fill in the vector
for ( auto & it : v )
std::cout << *it << std::endl;
或使用标准算法:
#include <iostream>
#include <typeinfo>
#include <vector>
#include <memory>
#include <algorithm>
int main()
{
std::vector< std::unique_ptr< int > > v;
v.emplace_back( new int( 3 ) );
v.emplace_back( new int( 5 ) );
std::for_each( v.begin(), v.end(), []( const std::unique_ptr< int > & it ){ std::cout << *it << std::endl; } );
}
关于c++ - 如何在 std::vector 中存储对象而不复制或 move 构造函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20487801/