亲爱的。我想知道是否有一些情况你会有目的地通过C中的值传递一个参数。让我重新说一下。你什么时候有目的地使用C的大对象传值?或者,您何时关心对象参数是否完全复制到局部变量中?
编辑:现在我考虑一下,如果你可以避免指针,那就去做吧。如今,“深度”复制对于小型应用程序中的大部分内容都是可能的,而浅层复制更容易出现指针错误。也许
答案 0 :(得分:3)
在C(没有const引用)中,您通过值传递了3个原因。
您不希望接收函数在其上下文之外修改源。这是学校教授的标准理由,因为它为什么要通过价值。
如果值适合架构的寄存器,则按值传递会更便宜 - 如果编译器非常智能,则可能会寄存。按值传递意味着没有指针创建,也没有取消引用来获取传入的值。虽然收益很小,但在某些情况下会增加。
按值传递会减少输入次数。一个很难理解的理由,但确实如此。
const关键字否定了大多数原因1,但原因2仍然有价值,是我通过值传递的主要原因。
答案 1 :(得分:1)
嗯,首先,如果你想改变它。
想象一下以下设计的功能:
int getNextCharAndCount (char *pCh);
每次调用它时,它会通过从函数返回计数并通过字符指针设置字符来从列表中返回下一个最常用的字符。
如果您只想使用(但不能更改)基础角色,我很难找到需要指针的另一个用例。这并不意味着当然不存在: - )
另外,我不确定你所讨论的是深层/浅层副本。这往往适用于带有指针的结构,其中浅拷贝只复制顶层,而深拷贝则复制所有层次。
您所指的是传值和传递参考。
答案 2 :(得分:1)
通过引用传递更便宜,因为您不必创建对象的本地副本。如果函数需要本地副本(出于任何目的) - 可能就是这种情况。
答案 3 :(得分:1)
我遵守规则:
从未对这种工作方式有任何问题。
答案 4 :(得分:1)
如果我们对此迂腐,那么C中的每一个都是值得传递的。您可以按值传递指针,而不是按值传递实际对象,但它仍然是按值传递。
无论如何,为什么要传递整个对象而不是指向对象的指针?好吧,首先,您的编译器可能能够优化调用,以便在封面下只复制一个地址。另外/或者,一旦引入指针,由于别名,您的编译器可能无法对函数进行尽可能多的优化。它也不易出错,不必记住取消引用。调用者也可以确定他传入的内容没有被修改(const并不能保证这一点,它可以被危险地抛弃)
答案 5 :(得分:0)
我不认为你关于字符的争论有用。即使你的char
在概念上是1个字节,函数调用的每个参数通常都会转换为整个(字大小的)寄存器,并且为了提高效率而转换到堆栈中相同的空间量。
如果您真的想要(并且我相信,也可以返回它们),您可以在堆栈上传递整个struct
作为参数。这是避免分配内存和担心指针卫生的一种方法。
答案 6 :(得分:0)
根据调用堆栈的构建方式,char和char *可能占用相同的空间。通常,在字边界上对齐值是更好的。访问字边界上的32位指针的成本可能远低于在非字边界上访问它的成本。
如果您不希望修改该值,则按值传递会更安全。通过引用传递可能是危险的。考虑通过参考传递
CONST int ONE = 1; increment( *ONE ); print ONE;
如果修改常量,则输出为2.