考虑以下代码:
struct s { /* ... */ };
void f(struct s x) { /* ... */) /* (1) */
/* or */
void f(const struct s *x) { /* ... */ } /* (2) */
当struct s
具有合适的尺寸时,在哪种情况下我们应该更喜欢第一种形式?
答案 0 :(得分:5)
你问哪个更好?
这取决于你想要做什么 - 带指针的第二种形式会更有效率。但是,如果您只想将值传递给f
而不必担心副作用,那么您可以使用第一个签名 - 只要struct
不是太大。
答案 1 :(得分:3)
我建议阅读this。
如果struct s
的大小合适,那么你应该避免按值传递它,特别是在递归函数中。
按值传递结构意味着它在函数调用之前被复制。这导致执行速度变慢,内存利用率更高。另请注意,struct
将在堆栈中进行分配,在某些系统中,堆栈大小非常有限。
我建议在每种情况下使用指针,除非您需要通过函数修改结构的多个副本,并且您不希望这些修改仅在每个函数的范围内可见。
答案 2 :(得分:-1)
当您希望f
获取x
的副本而不是const
指针x
时,请首选表单。