我有一个解析函数,它解析来自字节缓冲区的编码长度,它将解析的长度作为int返回,并将索引作为整数arg作为缓冲区.我希望函数根据它的解析来更新索引,即希望通过引用传递该索引.在C我只是通过int *.在Java中最干净的方法是什么?我目前正在考虑传递索引arg.作为一个int[],但它有点难看.
每隔一段时间我就会遇到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++代码,在函数调用方面,我想到了一个问题.比较这个伪代码功能:
not-void function-name () {
do-something
return value;
}
int main () {
...
arg = function-name();
...
}
Run Code Online (Sandbox Code Playgroud)
使用其他相同的伪代码功能:
void function-name (not-void& arg) {
do-something
arg = value;
}
int main () {
...
function-name(arg);
...
}
Run Code Online (Sandbox Code Playgroud)
哪个版本更有效,以及在什么方面(时间,内存等)?如果它取决于,那么第一个什么时候会更有效率,什么时候第二个会更高效?
编辑:对于上下文,此问题仅限于与硬件平台无关的差异,并且大多数情况下也是软件.是否有任何与机器无关的性能差异?
编辑:我不知道这是一个重复.另一个问题是将参考传递(上游代码)与传递值(下图)进行比较:
not-void function-name (not-void arg)
Run Code Online (Sandbox Code Playgroud)
这跟我的问题不一样.我的重点不在于将参数传递给函数的更好方法.我关注的是这是更好的方式来传递出一个结果来自外部范围的变量.
你能用"R"通过参考吗?例如,在以下代码中:
setClass("MyClass",
representation(
name="character"
))
instance1 <-new("MyClass",name="Hello1")
instance2 <-new("MyClass",name="Hello2")
array = c(instance1,instance2)
instance1
array
instance1@name="World!"
instance1
array
Run Code Online (Sandbox Code Playgroud)
输出是
> instance1
An object of class “MyClass”
Slot "name":
[1] "World!"
> array
[[1]]
An object of class “MyClass”
Slot "name":
[1] "Hello1"
[[2]]
An object of class “MyClass”
Slot "name":
[1] "Hello2"
Run Code Online (Sandbox Code Playgroud)
但我希望如此
> instance1
An object of class “MyClass”
Slot "name":
[1] "World!"
> array
[[1]]
An object of class “MyClass”
Slot "name":
[1] "World!"
[[2]]
An object of class …Run Code Online (Sandbox Code Playgroud) 在我大学的C编程课程中,教授及其后来的书在引用C中的指针时使用了术语调用或通过引用传递.
我的教授称之为"参考函数调用"的一个例子:
int sum(int *a, int *b);
Run Code Online (Sandbox Code Playgroud)
我的教授称之为"价值函数呼叫"的一个例子:
int sum(int a, int b);
Run Code Online (Sandbox Code Playgroud)
我读过 C不支持通过引用调用.根据我的理解,指针通过值传递.
基本上,说指针是C通过引用传递的方式是不正确的吗?说你不能通过C中的引用传递但是可以使用指针替代它会更正确吗?
2015年11月11日更新
从我的问题起源的方式来看,我认为术语的争论已经产生,实际上我看到了两个具体的区别.
在阅读了@Haris的更新答案之后,为什么这不是那么黑白,这是有道理的.
在PHP中,函数参数可以通过在函数声明中的参数前加一个&符号来引用,如下所示:
function foo(&$bar)
{
// ...
}
Run Code Online (Sandbox Code Playgroud)
现在,我知道这不是为了提高性能,而是为了允许函数更改通常超出其范围的变量.
相反,PHP似乎使用Copy On Write来避免复制对象(也可能是数组),直到它们被更改为止.因此,对于不更改其参数的函数,效果应与通过引用传递它们的效果相同.
但是,我想知道Copy On Write逻辑是否可能在传递引用时短路,以及是否会对性能产生任何影响.
ETA:可以肯定的是,我认为它并不快,而且我很清楚这不是引用的内容.所以我认为我自己的猜测非常好,我只是想找一个真正知道发生在幕后的人的回答.在PHP开发的五年中,我总是发现很难通过阅读源来获得PHP内部的高质量信息.
如何在C中通过引用传递一组结构?
举个例子:
struct Coordinate {
int X;
int Y;
};
SomeMethod(Coordinate *Coordinates[]){
//Do Something with the array
}
int main(){
Coordinate Coordinates[10];
SomeMethod(&Coordinates);
}
Run Code Online (Sandbox Code Playgroud) 这是允许通过引用传递数组?
void foo(double& *bar)
Run Code Online (Sandbox Code Playgroud)
似乎我的编译器说没有.为什么?通过引用传递数组的正确方法是什么?还是一个解决方法?我有一个数组参数,我的方法应该修改,然后我应该检索.或者,我可以使这个数组成为一个类成员,它工作正常,但它对我的代码的其他部分有很多缺点(我想避免).
感谢致敬.
当你将一个像list,array这样的集合传递给python中的另一个函数时,是否会复制它,或者它只是一个指针?