ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

C++ 这些情况你应该使用按值传递(附带详细解释)—————C++2.0 知识点补充

2021-11-29 21:31:52  阅读:193  来源: 互联网

标签:std 知识点 按值 形参 newName C++ 传递 names 2.0


C++2.0 知识点补充

文章目录

1 某些情况下考虑按值传递

需要按值传递的条件:对于可复制的、在移动成本低廉的并且一定会被复制的形参,按值传递可能会和按引用传递的具备相近的效率,并且可能生成更少量的目标代码。

条件解读和示例代码如下:

  • 按值传递的好处:
    • 1,只需要考虑按值传递 (相对于重载版本只要撰写单个函数;相对于万能引用版本可以避免万能引用带来的一系列问题)【效率可能没有剩余两者高】;
    • 2,仅针对可复制的形参,才考虑按值传递(如果形参是只移动类型,那么重载版本就只需要一个接受右值的重载版本,失去了按值传递的好处);
  • 3,按值传递仅在移动成本低廉的情况下,才值得考虑(因为按值传递,相对于重载和万能引用版本会多一次额外的移动操作,如果移动操作成本高,那么移动就和复制没有区别了);
  • 4,应该只针对移动会被复制的形参菜考虑按值传递。
    • 因为对于构造来实施形参复制的函数,使用按值传递,无论传入的是左值还是右值,都会招致一次额外移动所带来的成本;
    • 对于采用赋值来实施赋形参复制的,可能会导致额外的内存分配和回收的成本(例如,动态分配中存值的一部分形参类型,例如std::stringstd::vector
//版本1:左右值重载
class Widget{
public:
    void addName(const std::string& newName){
        names.push_back(newName);
    }
    void addName(std::string&& newName){
        names.push_back(newName);
    }
private:
    std::vector<std::string> names;
};
//版本2:万能引用
class Wiget{
public:
    template<class T>
    void addName(T&& newName){
        names.push_back(std::forward<T>(newName));
    }
private:
    std::vector<std::string> names;	
};
//版本3:按值传递
class Widget{
public:
    void addName(std::string newName){
        names.push_back(std::move(newName));
    }
private:
    std::vector<std::string> names;   
};

结论就是总是采用重载或者万能引用,而非按值传递,除非确定按值传递能够为所需的形参类型生成可接受效率的代码。

标签:std,知识点,按值,形参,newName,C++,传递,names,2.0
来源: https://blog.csdn.net/qq_33375598/article/details/121606259

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有