Skip to content

什么是右值引用?std::move到底是做什么的?到底移动语义是什么?为什么说移动更快? #206

Answered by Mq-b
mq-loser asked this question in Q&A
Discussion options

You must be logged in to vote

前言

在开始回答问题之前,我们首先要说明:C++11 引入的移动语义,本身逻辑其实是非常的简单的,但是新增的值类别和其规则是较为繁杂的,很多人之所以不会并且对移动语义抱有错误的幻想,无非是被一些互联网的错误想法影响的。


什么是右值引用?

右值引用就是右值引用,它和左值引用一样,算是一种引用。不用想其他的东西,回归到语言上,问题的本身即可。

C++11 引入右值引用,并且引入了一整套的规则:值类别,即:左值、纯右值、亡值。

如果缺少值类别的基本知识,请先观看视频

其实简单来说,就是将各种表达式分类,哪些是左值表达式,哪些是右值(纯右值和亡值都是右值)。右值引用只能被右值表达式初始化。

概念并不是我们的重点,默认各位了解一些基本的概念,以下示例能展示我们的意思:

struct X{
    X() = default;
    X(const X& x){
        // ...todo 进行资源的复制
    }
    X(X&& x)noexcept {
        // ...todo 进行资源的移动
    }
private:
    // ...todo 很多的数据成员
};
  • 在右值引用(移动语义)出现之前,我们没有办法简单的区分,你到底是要复制?还是要移动?在右值引用(移动语义)出现后,我们可以了。

开发者们约定移动构造这些右值引用的函数,是“转移所有权”。

你可以非常粗略的理解为,复制就是复制一份新的,但是移动呢,是把原对象的指向资源的指针,赋给新的对象成员,也就是所谓的转移所有权,通常的实现是转移指向数据的那个指针给新对象就行(当然了…

Replies: 3 comments 6 replies

Comment options

You must be logged in to vote
1 reply
@MrShinshi
Comment options

Answer selected by Mq-b
Comment options

You must be logged in to vote
2 replies
@Mq-b
Comment options

@Meteor-Z
Comment options

Comment options

You must be logged in to vote
3 replies
@Mq-b
Comment options

@ZZy979
Comment options

@Mq-b
Comment options

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Category
Q&A
Labels
good first issue Good for newcomers category: daily 卢瑟日经 treasure best luse
5 participants