[英]Passing structure as an argument in function
我有一个关于在 function 中传递 arguments 的问题。就像我发现我可以通过两种方式传递结构的 arguments 一样:
第一:
name_t* foo(name_t* foo)
{
//do some changes with structure
return foo->something
}
第二:
name_t foo(name_t foo)
{
//do some changes with structure
return foo.something
}
这些方法有什么区别?
memory是怎么写的?
当我在同一个function中使用第一种方法和第二种方法时是否有水下岩石? 例如,当两个 arguments 通过相同的 function 时,第一个等于第二个,反之亦然。
像那样:
name_t* foo(name_t* foo, name_t foo2)
{
//do some changes with structures
foo->something = foo2.something;
return foo;
}
谢谢。
第一个版本传递一个指向调用者结构的指针。 通过指针所做的任何更改都会影响调用者的结构。
第二个版本传递调用者结构的副本,因为 C 是一种按值调用的语言。 任何更改只会影响本地副本,不会影响调用者的结构。 但是,它是一个浅拷贝; 如果结构包含指向其他结构的指针,则不会递归复制它们,并且对那些引用结构的更改将影响原始结构。
最后一个例子应该没问题。 foo2
是调用者结构的副本,您可以对其进行更改而不影响调用者。 然后你可以在通过foo
指针赋值的时候修改调用者的结构体。 没有别名问题,因为一个是副本。
除了上面评论中提出的不同要点(参数名称隐藏 function 名称,第一和第二个剪辑中的 function 签名不一致)。
我想建议您在决定如何创建和传递结构实例时应该考虑结构的物理大小:
typedef struct name_t {
char title[256];
int something;
} name_t;
int my_function(name_t n) {
// this function cannot change the sender's copy of n
return strlen(n.title);
}
int my-by_ref(name_t * n) {
// this function has the ability to change n and reflect changes back
// do work
return ...
}
在将int
表示为 4 个字节的系统上,此结构的每个实例将占用 260 个字节。
name_t person = {"John Doe", 1}; // 260 bytes on stack
int len_title = my_function(person); // pushes another 260 bytes onto the stack
int result = my_by_ref(&person); // pushes the number of bytes a pointer takes
...
这是一个人为的例子,但通过引用发送将需要 CPU 复制人的地址(通常为 8 个字节,但取决于您的操作系统),而不是 260 个字节。 如果需要经常处理此结构,则可以加起来。
有许多更有效的方法来实现这样的任务,每个方法都有一定的责任,例如确保在 function 完成后,您不会返回指向 scope 中的 go 的数据指针,这些数据在您问题的 scope 之外。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.