C++—— pass by value and use std::move

博客讨论了C++11引入移动语义后,对于使用const引用作为构造函数参数的警告。作者指出,Clang-Tidy建议使用值传递并配合std::move,以提高性能。通过分析不同情况下的构造和移动成本,作者解释了为何在某些情况下,值传递和std::move可能更优。文章提醒开发者,虽然优化是好的,但不必盲目追求,应以简洁和适用为主。
摘要由CSDN通过智能技术生成

一个警告引发的思考

在c++11之前,无论是effective系列还是c++教程,都会告诉我们在一定情况下使用const &来节省性能。但是在c++11之后,有了移动语义,使一些不可能的行为变成了可能。我们先来看一段简单的代码。

class Person {
private:
    unsigned m_age = 0;
    string m_name;
    Person(const string & name) : m_name(name) { }
}

clang-tidy会给出这样的一个警告。

Clang-Tidy: Pass by value and use std::move

为什么会这样呢,这无疑是一个正确的构造函数,但是为什么还要给我们这样的警告呢?

使用值传递加移动语义避免不必要的消耗

我们按照警告更改成后是这样

Person(string  name) : m_name(std::move(name)) { }

你可能会感到疑惑?为什么使用了值传递还会有更高的性能呢?这似乎和直觉不符。

慢慢来,我们一点点分析。

假设调用构造函数传递的是一个左值,那么好,string会进行copy一次,然后再进行一次移动构造。 

假设调用构造函数传递的是一个右值,string会进行一次右值版本的构造,也就是一次移动构造,然后再进行一次移动构造。

第一种情况:一次拷贝构造 + 一次移动构造

第二种情况:两次移动构造

而如果我们还是使用const & 的方式来进行拷贝构造,无论如何,都需要

拷贝指针一次(引用)+ 一次拷贝构造

很明显,pass by value and use std::move的情况平均下来应当是好于pass by const reference and use copy constructor

作者思考:

        pass by value and use std::move 这样的改变,在大部分的情况下是无关痛痒的。大部分情况下,你可以听从clang-tidy的建议,但是不用为了追求移动而移动,不用为了高级而高级。简单胜于繁琐,简洁胜于冗杂。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值