vector::push_back(V&& v)用不用右值引用的区别

zhangwuji156 2016-11-09 11:58:25
stl的push_back有两个实现,一个是const &一个是&&(右值引用)
这两个实现有什么区别吗?
	class obj
{
public :
obj() { cout << ">> create obj " << endl; }
obj(const obj& other) { cout << ">> copy create obj " << endl; }
};
void push_back(const obj& o)
{
obj b = o;
}
void push_back(obj&& o)
{
obj b = o;
}
void test()
{
push_back(obj());
}

网上关于右值引用这个文章
http://www.cnblogs.com/TianFang/archive/2013/01/26/2878356.html
只是讲了作为传出,不知道跟传入有什么关系
...全文
1005 8 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
paschen 版主 2016-11-09
  • 打赏
  • 举报
回复 1
右值版本可以不用复制对象,只是移动对象 比如对象的类有移动构造函数,就会调用,通常移动比复制可以减小大量开销
jiqiang01234 2016-11-09
  • 打赏
  • 举报
回复
你的class obj并没有实现移动构造和移动赋值,所以push_back(obj&& o)中并没有启动移动功能,只是退化为普通的拷贝
Jenf_Mu 2016-11-09
  • 打赏
  • 举报
回复
namespace __stdTest
{
	class obj
	{
		vector<int>* v;
	public :
		obj() { 
			v = new vector<int>(5);
			cout << ">> create obj " << endl; }
		obj(const obj& other) { 
			v = new vector<int>;
			*v = *(other.v);

			cout << ">> copy create obj " << endl; }
		obj(obj&& other) { 
			std::swap(v, other.v);
			cout << ">> move create obj " << endl; }
		//void modify(){i++;};
		~obj()
		{
			delete v;
		}
	};
	
	void push_back(const obj& o)
	{
		obj b=o;
	}
	void push_back(obj&& o)
	{
		//o.modify();
		obj b=std::move(o);
	}
	void test()
	{
		//obj()
		//obj o;
		push_back(obj());
	}
}
fefe82 2016-11-09
  • 打赏
  • 举报
回复
引用 6 楼 zhangwuji156 的回复:
[quote=引用 5 楼 fefe82 的回复:] [quote=引用 4 楼 zhangwuji156 的回复:] [quote=引用 1 楼 jiqiang01234 的回复:] 你的class obj并没有实现移动构造和移动赋值,所以push_back(obj&& o)中并没有启动移动功能,只是退化为普通的拷贝
看了一下vector::push_back的两种实现,完全一样啊,那怎么体现出来不一样?[/quote] 来自 Ubuntu 16.04, gcc 5.4
      void
      push_back(const value_type& __x)
      {
    if (this->_M_impl._M_finish != this->_M_impl._M_end_of_storage)
      {
        _Alloc_traits::construct(this->_M_impl, this->_M_impl._M_finish,
                                 __x);
        ++this->_M_impl._M_finish;
      }
    else
#if __cplusplus >= 201103L
      _M_emplace_back_aux(__x);
#else
      _M_insert_aux(end(), __x);
#endif
      }

#if __cplusplus >= 201103L
      void
      push_back(value_type&& __x)
      { emplace_back(std::move(__x)); }

      template<typename... _Args>
        void
        emplace_back(_Args&&... __args);
#endif
[/quote] 我看的VS2010的,难道VS搞了个右值引用的接口,里面实现一样,骗人的?[/quote] 换 2015 吧 ...
zhangwuji156 2016-11-09
  • 打赏
  • 举报
回复
引用 5 楼 fefe82 的回复:
[quote=引用 4 楼 zhangwuji156 的回复:] [quote=引用 1 楼 jiqiang01234 的回复:] 你的class obj并没有实现移动构造和移动赋值,所以push_back(obj&& o)中并没有启动移动功能,只是退化为普通的拷贝
看了一下vector::push_back的两种实现,完全一样啊,那怎么体现出来不一样?[/quote] 来自 Ubuntu 16.04, gcc 5.4
      void
      push_back(const value_type& __x)
      {
    if (this->_M_impl._M_finish != this->_M_impl._M_end_of_storage)
      {
        _Alloc_traits::construct(this->_M_impl, this->_M_impl._M_finish,
                                 __x);
        ++this->_M_impl._M_finish;
      }
    else
#if __cplusplus >= 201103L
      _M_emplace_back_aux(__x);
#else
      _M_insert_aux(end(), __x);
#endif
      }

#if __cplusplus >= 201103L
      void
      push_back(value_type&& __x)
      { emplace_back(std::move(__x)); }

      template<typename... _Args>
        void
        emplace_back(_Args&&... __args);
#endif
[/quote] 我看的VS2010的,难道VS搞了个右值引用的接口,里面实现一样,骗人的?
fefe82 2016-11-09
  • 打赏
  • 举报
回复
引用 4 楼 zhangwuji156 的回复:
[quote=引用 1 楼 jiqiang01234 的回复:] 你的class obj并没有实现移动构造和移动赋值,所以push_back(obj&& o)中并没有启动移动功能,只是退化为普通的拷贝
看了一下vector::push_back的两种实现,完全一样啊,那怎么体现出来不一样?[/quote] 来自 Ubuntu 16.04, gcc 5.4
      void
      push_back(const value_type& __x)
      {
    if (this->_M_impl._M_finish != this->_M_impl._M_end_of_storage)
      {
        _Alloc_traits::construct(this->_M_impl, this->_M_impl._M_finish,
                                 __x);
        ++this->_M_impl._M_finish;
      }
    else
#if __cplusplus >= 201103L
      _M_emplace_back_aux(__x);
#else
      _M_insert_aux(end(), __x);
#endif
      }

#if __cplusplus >= 201103L
      void
      push_back(value_type&& __x)
      { emplace_back(std::move(__x)); }

      template<typename... _Args>
        void
        emplace_back(_Args&&... __args);
#endif
zhangwuji156 2016-11-09
  • 打赏
  • 举报
回复
引用 1 楼 jiqiang01234 的回复:
你的class obj并没有实现移动构造和移动赋值,所以push_back(obj&& o)中并没有启动移动功能,只是退化为普通的拷贝
看了一下vector::push_back的两种实现,完全一样啊,那怎么体现出来不一样?
zhangwuji156 2016-11-09
  • 打赏
  • 举报
回复
引用 1 楼 jiqiang01234 的回复:
你的class obj并没有实现移动构造和移动赋值,所以push_back(obj&& o)中并没有启动移动功能,只是退化为普通的拷贝
可以加一个 obj(obj&& other)函数,但如果里面实现还是和原来一样的话,了起不到提高效率的作用,这个函数要怎么实现呢?

65,182

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧