在C++中通过值传递或通过常量引用传递是否更好?
我想知道哪个是更好的做法.我意识到通过常量引用传递应该在程序中提供更好的性能,因为你没有复制变量.
我理解如果我传递一个值类型(int,struct等)作为参数(没有ref关键字),该变量的副本将传递给该方法,但如果我使用该ref关键字,则传递对该变量的引用,不是新的.
但是使用引用类型(如类),即使没有ref关键字,也会将引用传递给方法,而不是副本.那么ref关键字与引用类型的用途是什么?
举个例子:
var x = new Foo();
Run Code Online (Sandbox Code Playgroud)
以下有什么区别?
void Bar(Foo y) {
y.Name = "2";
}
Run Code Online (Sandbox Code Playgroud)
和
void Bar(ref Foo y) {
y.Name = "2";
}
Run Code Online (Sandbox Code Playgroud) class D {
public static void main(String args[]) {
Integer b2=128;
Integer b3=128;
System.out.println(b2==b3);
}
}
Run Code Online (Sandbox Code Playgroud)
输出:
false
Run Code Online (Sandbox Code Playgroud)
class D {
public static void main(String args[]) {
Integer b2=127;
Integer b3=127;
System.out.println(b2==b3);
}
}
Run Code Online (Sandbox Code Playgroud)
输出:
true
Run Code Online (Sandbox Code Playgroud)
注意:-128到127之间的数字为真.
这是我正在尝试运行的简化版本:
for (var i = 0; i < results.length; i++) {
marker = results[i];
google.maps.event.addListener(marker, 'click', function() {
change_selection(i);
});
}
Run Code Online (Sandbox Code Playgroud)
但我发现每个监听器都使用results.length的值(for循环终止时的值).我如何添加监听器,使得每次使用i时我添加它的值,而不是对i的引用?
javascript closures listener pass-by-reference pass-by-value
如果我有一个需要使用a的函数shared_ptr,那么传递它的引用会不会更有效(所以为了避免复制shared_ptr对象)?有哪些可能的不良副作用?我设想了两种可能的情况:
1)在函数内部,复制由参数组成,如
ClassA::take_copy_of_sp(boost::shared_ptr<foo> &sp)
{
...
m_sp_member=sp; //This will copy the object, incrementing refcount
...
}
Run Code Online (Sandbox Code Playgroud)
2)在函数内部仅使用参数,例如
Class::only_work_with_sp(boost::shared_ptr<foo> &sp) //Again, no copy here
{
...
sp->do_something();
...
}
Run Code Online (Sandbox Code Playgroud)
我无法在两种情况下都看到传递boost::shared_ptr<foo>by值而不是引用的充分理由.按值传递只会"暂时"增加由于复制而引用的引用计数,然后在退出函数范围时减少它.我忽略了什么吗?
只是为了澄清,在阅读了几个答案之后:我完全赞同过早优化的问题,而且我总是试着先在热点上进行首次剖析.如果你知道我的意思,我的问题更多来自纯粹的技术代码观点.
我是Swift的新手,我只是读取类通过引用传递,数组/字符串等被复制.
通过引用传递的方式与Objective-C或Java中的方式相同,其中您实际传递"a"引用或是否通过引用正确传递?
当我遇到计算立方体体积的函数时,我正在阅读我的C++书籍(Deitel).代码如下:
double cube (const double side){
return side * side * side;
}
Run Code Online (Sandbox Code Playgroud)
使用"const"限定符的解释是这样的:"const限定应该用于强制执行最小特权原则,告诉编译器函数不修改变量端".
我的问题:这里不是使用"const"冗余/不必要的,因为变量是通过值传递的,所以函数无论如何都不能修改它?
每隔一段时间我就会遇到R具有复制修改语义的概念,例如在Hadley的devtools wiki中.
大多数R对象具有复制修改语义,因此修改函数参数不会更改原始值
我可以将这个术语追溯到R-Help邮件列表.例如,Peter Dalgaard在2003年7月写道:
R是一种函数式语言,具有惰性求值和弱动态类型(变量可以随意更改类型:a < - 1; a < - "a"是允许的).从语义上讲,一切都是复制修改,尽管在实现中使用了一些优化技巧来避免最严重的低效率.
R具有复制修改语义(原则上,有时在实践中),因此一旦对象的一部分发生变化,您可能必须在新的位置查找包含它的任何内容,包括可能的对象本身.
我们付出了相当多的努力来实现这一目标.我会将语义描述为"复制修改(如有必要)".仅在修改对象时才进行复制.(如果需要)部分意味着如果我们可以证明修改不能改变任何非局部变量,那么我们就可以继续修改而不需要复制.
它不在手册中
无论我搜索多么努力,我都无法在R手册中找到"复制修改"的参考,无论是在R语言定义还是在R Internals中
题
我的问题有两个部分:
例如,谈论"传递引用"是否合适,因为承诺传递给函数?
如何在Python中通过引用传递整数?
我想修改我传递给函数的变量的值.我已经读过Python中的所有内容都是按值传递的,但必须有一个简单的技巧.例如,在Java中,你可以通过引用类型的Integer,Long等等.
由于我们在C++中移动了语义,所以现在通常这样做
void set_a(A a) { _a = std::move(a); }
Run Code Online (Sandbox Code Playgroud)
原因是,如果a是左值,则副本将被删除,并且只有一个移动.
但如果a是左值,会发生什么?似乎将有一个复制结构,然后是一个移动赋值(假设A有一个适当的移动赋值运算符).如果对象具有太多成员变量,则移动分配可能成本很高.
另一方面,如果我们这样做
void set_a(const A& a) { _a = a; }
Run Code Online (Sandbox Code Playgroud)
只有一个副本分配.如果我们传递左值,我们可以说这种方式优于传值的习语吗?
pass-by-value ×10
c++ ×4
boost ×1
c# ×1
c++11 ×1
closures ×1
comparison ×1
const ×1
constants ×1
function ×1
integer ×1
java ×1
javascript ×1
listener ×1
parameters ×1
python ×1
r ×1
shared-ptr ×1
swift ×1
variables ×1