C++ 这些情况你应该使用按值传递(附带详细解释)—————C++2.0 知识点补充
2021/11/29 22:06:42
本文主要是介绍C++ 这些情况你应该使用按值传递(附带详细解释)—————C++2.0 知识点补充,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
C++2.0 知识点补充
文章目录
- C++2.0 知识点补充
- 1 某些情况下考虑按值传递
1 某些情况下考虑按值传递
需要按值传递的条件:对于可复制的、在移动成本低廉的并且一定会被复制的形参,按值传递可能会和按引用传递的具备相近的效率,并且可能生成更少量的目标代码。
条件解读和示例代码如下:
- 按值传递的好处:
- 1,只需要考虑按值传递 (相对于重载版本只要撰写单个函数;相对于万能引用版本可以避免万能引用带来的一系列问题)【效率可能没有剩余两者高】;
- 2,仅针对可复制的形参,才考虑按值传递(如果形参是只移动类型,那么重载版本就只需要一个接受右值的重载版本,失去了按值传递的好处);
- 3,按值传递仅在移动成本低廉的情况下,才值得考虑(因为按值传递,相对于重载和万能引用版本会多一次额外的移动操作,如果移动操作成本高,那么移动就和复制没有区别了);
- 4,应该只针对移动会被复制的形参菜考虑按值传递。
- 因为对于构造来实施形参复制的函数,使用按值传递,无论传入的是左值还是右值,都会招致一次额外移动所带来的成本;
- 对于采用赋值来实施赋形参复制的,可能会导致额外的内存分配和回收的成本(例如,动态分配中存值的一部分形参类型,例如
std::string
和std::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; };
结论就是总是采用重载或者万能引用,而非按值传递,除非确定按值传递能够为所需的形参类型生成可接受效率的代码。
这篇关于C++ 这些情况你应该使用按值传递(附带详细解释)—————C++2.0 知识点补充的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-11-22怎么实现ansible playbook 备份代码中命名包含时间戳功能?-icode9专业技术文章分享
- 2024-11-22ansible 的archive 参数是什么意思?-icode9专业技术文章分享
- 2024-11-22ansible 中怎么只用archive 排除某个目录?-icode9专业技术文章分享
- 2024-11-22exclude_path参数是什么作用?-icode9专业技术文章分享
- 2024-11-22微信开放平台第三方平台什么时候调用数据预拉取和数据周期性更新接口?-icode9专业技术文章分享
- 2024-11-22uniapp 实现聊天消息会话的列表功能怎么实现?-icode9专业技术文章分享
- 2024-11-22在Mac系统上将图片中的文字提取出来有哪些方法?-icode9专业技术文章分享
- 2024-11-22excel 表格中怎么固定一行显示不滚动?-icode9专业技术文章分享
- 2024-11-22怎么将 -rwxr-xr-x 修改为 drwxr-xr-x?-icode9专业技术文章分享
- 2024-11-22在Excel中怎么将小数向上取整到最接近的整数?-icode9专业技术文章分享