std::数据结构中的向量移动语义
std::vector move semantics in a data structure
对于这个简单的循环队列,我想支持C++11的移动语义,这样push((就不会在不需要的情况下产生内存拷贝。
Circular<struct r, 1024> queue_;
queue_.push( { r0, r1 } );
然而,我担心我的实现,特别是下面的第二个push((,是不必要的或过于冗长。
template<typename T, size_t capacity>
class Circular
{
public:
Circular()
: have_(capacity)
, w_(0)
, r_(0)
{}
~Circular() {}
void push( const T& x ) { have_[ w_++ % capacity ] = x; }
void push( T&& x ) { have_[ w_++ % capacity ] = x; }
...
protected:
std::vector<T> have_;
size_t w_;
size_t r_;
};
有没有更好的方法来获得这些语义?(编辑:预期的语义真的实现了吗?(
后续:我们能在保留预期行为的同时避免重复push((方法的主体吗?
确实有一种更好的方法来获得这些语义:事实上,有一种方法可以让实际在代码当前没有的地方获得这些语义。:-(
接受push
中的右值引用是等式的一半,但在该函数中,它又是一个左值表达式,因此需要添加std::move
以"传递右值引用"。
void push( T&& x ) { have_[ w_++ % capacity ] = std::move(x); }
除此之外,我想不出有什么特别的改进。
相关文章:
- 何时在引用或唯一指针上使用移动语义
- 如何从具有移动语义的类对象中生成共享指针
- 可以使用移动语义更改或改进此C++代码吗?
- c++在使用指针时移动语义
- 移动语义和深层/浅层复制之间有什么关系?
- std::unique_lock移动语义
- 移动语义和运算符 + 重载
- C++ 移动语义是否在任何情况下都能节省资源?
- 移动语义在这里如何工作?
- 使用移动语义:右值引用作为方法参数
- 在C++中使用移动语义的正确方法是什么?
- 移动语义 c++ 单链表
- C++:使用整数移动语义
- 当变量和参数名称匹配时,移动语义构造失败
- 在 C++11 中移动语义
- 方法冗余移动调用的移动语义
- 复制省略并在返回值中移动语义
- std::元组和移动语义
- 移动语义与返回shared_ptr?
- C++具有移动语义的可变参数工厂会导致运行时崩溃