- 主题:这种情况传值好还是传引用?
内置类型/很小的对象(包括int64、std::string_view),传值,对优化有好处,可以直接走寄存器,不用走内存。
如果传递常量引用、指针,编译器需要知道这个东西对应的内存在caller、callee处是怎么被引用的才能优化得更好,
不然只能采用保守的优化(因为别的不知道的变量可能也指向了对应的内存,aliasing)。
尤其是对于接口中的参数,编译器可能只知道接口的caller、callee二者之一的情况。
CppCoreGuidelines也说得比较清楚
F.16: For “in” parameters, pass cheaply-copied types by value and others by reference to const
Reason Both let the caller know that a function will not modify the argument, and both allow initialization by rvalues.
What is “cheap to copy” depends on the machine architecture, but two or three words (doubles, pointers, references) are usually best passed by value. When copying is cheap, nothing beats the simplicity and safety of copying, and for small objects (up to two or three words) it is also faster than passing by reference because it does not require an extra indirection to access from the function.
Should I use call-by-value or call-by-reference?
That depends on what you are trying to achieve:
If you want to change the object passed, call by reference or use a pointer; e.g. void f(X&); or void f(X*);
If you don't want to change the object passed and it is big, call by const reference; e.g. void f(const X&);
Otherwise, call by value; e.g. void f(X);
What do I mean by "big"? Anything larger than a couple of words.
--
修改:z16166 FROM 222.129.205.*
FROM 222.129.205.*
安全性好是啥意思?
小对象的传值和传引用,这里有个汇编代码的对比
https://quuxplusone.github.io/blog/2021/11/09/pass-string-view-by-value/
【 在 hdftiger 的大作中提到: 】
: 我在某地看到,传常引用和传值比较,效率高安全性也好,你觉得呢?
--
修改:z16166 FROM 222.129.205.*
FROM 222.129.205.*
寻址那个,说的是上限,不一定每个人都会遇到需要用到这个上限的场合,但如果有人需要,他可以从这个角度努力
我们可以在浑浑噩噩中混日子,但如果有人向往诗和远方,他可以去追寻,哈哈
【 在 foliver 的大作中提到: 】
: 不知什么时候,c++程序员们开始信仰const ref的传递性能好于ref,编译器有机会优化,这简直是以讹传讹。
: const ref最大的优点是语义检查,和性能无关。const ref指向的变量本身是可变的。当然,const ref指向一个本身就是const的变量,就不要提了。
: 在回到楼主的问题。对于内置类型,传值和传const引用怎么选?没区别,爱用什么就用什么。不过个人习惯传值,无他,习惯了。
: ...................
--
修改:z16166 FROM 222.129.205.*
FROM 222.129.205.*
传值也一样啊,改了函数内部的值,不会影响外面的
【 在 hdftiger 的大作中提到: 】
: 安全性好,是因为常引用在函数内部不允许修改,跳出函数后仍旧可以正常使用,不会隐藏莫名其妙的修改内存的错误
--
FROM 222.129.205.*
别打击楼主的求甚解精神
遇到工具的告警,搞清楚为啥,不是坏事
【 在 song2692005 的大作中提到: 】
: 差不了几个皮秒,你还纠结这干啥?赶紧把功能完成吧。
: 难道你的程序都已经优化到皮秒级别了?
--
FROM 222.129.205.*
不迷信工具,搞清工具为什么那么警告,这不是研究回字的几种写法
作为一个C++er,"你我"可以甚至天天写着用传值方式来传递std:string、从来不用std::move的shi 山代码,而且可能这也没咋影响最终项目的成功,但是"你"不能阻挡"我"对性能的理解和追求,哈哈
虽然"我"深陷泥淖,但"我"向往净土。。。
【 在 xunery 的大作中提到: 】
: 搞不明白按工具说的做也不会有错
: 哪怕内建类型可能出现寻址差别甚至效率更低,碰到一个自定义类型就都赚回来了
: 养成良好的编码习惯收益远大于这个“回”有几种写法重要
--
修改:z16166 FROM 222.129.205.*
FROM 222.129.205.*