- 主题:这种情况传值好还是传引用?
有很多函数参数是 int64_t,静态检查提醒我传常量引用,这种情况有必要传引用吗?
--
FROM 218.76.62.*
没
【 在 speedboy2998 的大作中提到: 】
: 有很多函数参数是 int64_t,静态检查提醒我传常量引用,这种情况有必要传引用吗?
--
FROM 183.157.222.*
内置类型/很小的对象(包括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.*
最好还是传值,除非你在函数中要修改变量值。传值还安全。
【 在 speedboy2998 的大作中提到: 】
: 有很多函数参数是 int64_t,静态检查提醒我传常量引用,这种情况有必要传引用吗?
: --
:
发自「今日水木 on M2007J17C」
--
FROM 222.129.51.*
我在某地看到,传常引用和传值比较,效率高安全性也好,你觉得呢?
【 在 GoGoRoger 的大作中提到: 】
: 最好还是传值,除非你在函数中要修改变量值。传值还安全。
--
FROM 36.112.191.*
你说的不是基础类型吧?
【 在 hdftiger 的大作中提到: 】
:
: 我在某地看到,传常引用和传值比较,效率高安全性也好,你觉得呢?
: --
:
发自「今日水木 on M2007J17C」
--
FROM 222.129.51.*
我没有深入研究过编译器优化,窃以为,常引用会优于引用,编译器有很大优化空间,所以想听听你的看法
【 在 GoGoRoger 的大作中提到: 】
: 你说的不是基础类型吧?
--
FROM 36.112.191.*
不知什么时候,c++程序员们开始信仰const ref的传递性能好于ref,编译器有机会优化,这简直是以讹传讹。
const ref最大的优点是语义检查,和性能无关。const ref指向的变量本身是可变的。当然,const ref指向一个本身就是const的变量,就不要提了。
在回到楼主的问题。对于内置类型,传值和传const引用怎么选?没区别,爱用什么就用什么。不过个人习惯传值,无他,习惯了。
当然有人会说什么直接寻址间接寻址,在整个程序中,这对性能有啥影响。
【 在 hdftiger 的大作中提到: 】
: 我没有深入研究过编译器优化,窃以为,常引用会优于引用,编译器有很大优化空间,所以想听听你的看法
: 【 在 GoGoRoger 的大作中提到: 】
: : 你说的不是基础类型吧?
: ...................
--来自微微水木3.5.12
--
FROM 140.206.195.*
安全性好是啥意思?
小对象的传值和传引用,这里有个汇编代码的对比
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.*