C#与c++函数传递参数的比较

来源:互联网 发布:南京seo哪家好 编辑:程序博客网 时间:2024/06/06 09:34

转自:http://blog.csdn.net/sxbluebird/archive/2008/05/30/2496704.aspx【C++, C#】


值传递: 当调用的时候,发生了值拷贝,即函数的形参仅仅是用实参初始化了的副本; 这个形参,仅仅在函数内部有效,出了函数体,则自动失效。


引用传递:实际上,传递过去的实参的内存heap里面的地址, 自然在函数里面使用形参,改变的也就是heap里面的东西。就算函数里面的形参,出了函数体失效,那么heap里面的值实际上已经在函数里面修改了,达到了效果。



在C++里面, 默认都是按照值传递,除非声明函数的时候,使用了&来标识是要用引用来传递。

对于数组,另外处理, 传递过去的都是数组的头元素的地址。所以函数不要写成:

Void PrintArray(int intArray[10])

这样默认给用户提示,这个数组是10个元素, 实际上仅仅有个首地址,其他的事不知道的。

Void PrintArray(int* intArray, int count)

这样才对,告诉用户有多少个元素在里面。

如果仅仅read, 不需要函数做修改的话,最好加上 const:

Void PrintArray(cosnt int* intArray, int count)



效率: 值传递需要拷贝,所以需要更多一些时间。

我做了一个试验:

直接传递vector: 9594ms

引用传递vector: 9534ms

20次,省60ms,效率上还是有区分的。



在C#里面, 默认都是按照声明的形参来做的:形参为class、引用类型的,按照引用类型来传递; 形参为struct、值类型的, 按照值拷贝传递。

所以,C#在处理这些的时候,效率都差不多,比C++差一些。 但实际使用上简单的多。

关键字ref, out就是为了模仿C++里面的&传递的。

Ref: 实参在使用前申明,并初始化, 在函数体里面-形参直接使用。

Out: 实参申明一下即可, 在函数体里面-形参里面初始化,再使用。

Ref, out在编译情况下是一样的,所以不能重载ref, out。仅仅在runtime才有区别。

Void printValue(ref int intValue);

Void PrintValue(out int intValue);

在同一个类里面出现,编译器会报:

error CS0663: cannot define overloaded methods that differ only on ref and out



使用C#的人享受一些编程快感,程序运行效率差些。

使用C++的人,享受编程苦感, 程序运行效率高些。



如此而已。

原创粉丝点击