标签: pass-by-value

在C++中通过值传递或通过常量引用传递是否更好?

在C++中通过值传递或通过常量引用传递是否更好?

我想知道哪个是更好的做法.我意识到通过常量引用传递应该在程序中提供更好的性能,因为你没有复制变量.

c++ variables constants pass-by-reference pass-by-value

203
推荐指数
6
解决办法
10万
查看次数

C#中引用类型变量的"ref"有什么用?

我理解如果我传递一个值类型(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)

c# parameters pass-by-reference pass-by-value

167
推荐指数
6
解决办法
4万
查看次数

当比较Java中的Integer包装器时,为什么128 == 128 false但127 == 127为真?

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之间的数字为真.

java comparison integer pass-by-reference pass-by-value

160
推荐指数
4
解决办法
4万
查看次数

如何将JS变量的值(而不是引用)传递给函数?

这是我正在尝试运行的简化版本:

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

116
推荐指数
3
解决办法
4万
查看次数

C++ - 将引用传递给std :: shared_ptr或boost :: shared_ptr

如果我有一个需要使用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值而不是引用的充分理由.按值传递只会"暂时"增加由于复制而引用的引用计数,然后在退出函数范围时减少它.我忽略了什么吗?

只是为了澄清,在阅读了几个答案之后:我完全赞同过早优化的问题,而且我总是试着先在热点上进行首次剖析.如果你知道我的意思,我的问题更多来自纯粹的技术代码观点.

c++ boost pass-by-reference pass-by-value shared-ptr

113
推荐指数
6
解决办法
5万
查看次数

Swift通过价值或通过参考传递

我是Swift的新手,我只是读取类通过引用传递,数组/字符串等被复制.

通过引用传递的方式与Objective-C或Java中的方式相同,其中您实际传递"a"引用或是否通过引用正确传递?

pass-by-reference pass-by-value pass-by-pointer swift

92
推荐指数
5
解决办法
6万
查看次数

通过值时,"const"不是多余的吗?

当我遇到计算立方体体积的函数时,我正在阅读我的C++书籍(Deitel).代码如下:

double cube (const double side){
    return side * side * side;
}
Run Code Online (Sandbox Code Playgroud)

使用"const"限定符的解释是这样的:"const限定应该用于强制执行最小特权原则,告诉编译器函数不修改变量端".

我的问题:这里不是使用"const"冗余/不必要的,因为变量是通过值传递的,所以函数无论如何都不能修改它?

c++ const pass-by-value

74
推荐指数
2
解决办法
2万
查看次数

R中的copy-on-modify语义到底是什么,以及规范源在哪里?

每隔一段时间我就会遇到R具有复制修改语义的概念,例如在Hadley的devtools wiki中.

大多数R对象具有复制修改语义,因此修改函数参数不会更改原始值

我可以将这个术语追溯到R-Help邮件列表.例如,Peter Dalgaard在20037月写道:

R是一种函数式语言,具有惰性求值和弱动态类型(变量可以随意更改类型:a < - 1; a < - "a"是允许的).从语义上讲,一切都是复制修改,尽管在实现中使用了一些优化技巧来避免最严重的低效率.

同样,Peter Dalgaard在20041月写道:

R具有复制修改语义(原则上,有时在实践中),因此一旦对象的一部分发生变化,您可能必须在新的位置查找包含它的任何内容,包括可能的对象本身.

更进一步,20002月, Ross Ihaka说:

我们付出了相当多的努力来实现这一目标.我会将语义描述为"复制修改(如有必要)".仅在修改对象时才进行复制.(如果需要)部分意味着如果我们可以证明修改不能改变任何非局部变量,那么我们就可以继续修改而不需要复制.

它不在手册中

无论我搜索多么努力,我都无法在R手册中找到"复制修改"的参考,无论是在R语言定义还是在R Internals中

我的问题有两个部分:

  1. 这在哪里正式记录?
  2. 复制修改如何工作?

例如,谈论"传递引用"是否合适,因为承诺传递给函数?

r pass-by-reference pass-by-value

71
推荐指数
2
解决办法
6008
查看次数

在Python中通过引用传递整数

如何在Python中通过引用传递整数?

我想修改我传递给函数的变量的值.我已经读过Python中的所有内容都是按值传递的,但必须有一个简单的技巧.例如,在Java中,你可以通过引用类型的Integer,Long等等.

  1. 如何通过引用将整数传递给函数?
  2. 什么是最佳做法?

python function pass-by-reference pass-by-value

70
推荐指数
8
解决办法
9万
查看次数

传值和后移是构建一个不好的习惯吗?

由于我们在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)

只有一个副本分配.如果我们传递左值,我们可以说这种方式优于传值的习语吗?

c++ pass-by-value rvalue-reference move-semantics c++11

63
推荐指数
4
解决办法
1万
查看次数