将常量指针传递给结构体 vs 值传递

3
推荐使用将结构体作为指向const的指针传递的方式,如下所示:

int doCalculations(const MyStruct* my_struct);

还是将struct按值传递,如下所示:

int doCalculations(MyStruct my_struct);

原因是什么呢?
在C++中,我记得在某个地方阅读到当struct/Class具有非平凡构造函数时,应该使用传递给const的引用。虽然在C语言中没有构造函数,但我想复制本地的struct仍需要一些时间。

这取决于你的函数将如何使用 struct。如果它必须更改 struct 内部的内容,则需要一个指针。否则,传递 struct 本身是更可取的。 - Kninnug
4
按值传递使用了不必要的堆栈空间。更常见的建议是,当MyStruct的大小超过某个较小的值x时,应该通过指向常量的指针进行传递 - const MyStruct* - simonc
2
@simonc:我想你的意思是“指向常量的指针”,而不是“常量指针”... - a1ex07
@a1ex07 是的,谢谢,我是指 const MyStruct*。我已经纠正了我的评论。 - simonc
推荐很大程度上取决于结构体的大小。 - 0decimal0
2个回答

4
如果您打算修改您的结构体,那么您显然必须通过指针传递它。
即使您不打算修改您的结构体,通常也会通过指针传递以避免不必要的复制。一个指针将占用sizeof(void *)内存,但可以通过寄存器传递(因此根本不使用堆栈内存)。
按值传递结构体几乎总是会在堆栈上复制它。
两种情况需要进行选择:
- 如果您的结构体可能被外部力量修改(即它具有易挥发字段),则您可能希望通过指针传递它,以始终拥有最新版本。 - 如果在执行函数期间您的结构体可能会停止存在(例如,另一个线程释放该内存),则显然必须对其进行复制(按值传递)。

如果你打算修改你的结构体,那么显然你必须通过指针传递。如果你不打算修改你的结构体,那么一般做法是通过指针传递,以避免不必要的复制。我不理解这两个句子的区别。 - 0decimal0
1
@PHIfounder 一般实践并不等同于需求。但我已经稍微澄清了一下。 - Sergey L.
@SergeyL. 你提到的最后一点关于结构体不复存在纯粹是理论上的吗? - Pacerier
@Pacerier 不是的,但这些情况通常是有意的并由程序员控制。例如:在堆栈上进行生产者-消费者线程处理。一旦你“消费”了一个元素,另一个线程很快就会覆盖那个内存,所以最好复制一份。 - Sergey L.

0

传递结构体的值不被建议有两个原因:

1). 将结构体内容复制到新的临时变量中所需的时间。

2). 如果结构体很大,将浪费大量的堆栈空间。

因此,使用指向常量的指针是一个更可行的选择。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接