我应该如何在函数中传递结构?

时间:2014-10-11 10:54:21

标签: c pointers struct reference

我很困惑,因为我有一段时间没有写过C.在C ++中,我们将它们作为引用传递,以便不复制整个结构。这也适用于C吗?我们是否应该将它们作为指针传递,即使我们不想修改它们,以避免复制?

换句话说,对于检查两个结构是否相等的函数,我们最好做

int equal(MyRecord* a, MyRecord* b);

并降低一点可读性(因为指针)

int equal(MyRecord a, MyRecord b);

会有相同的表现吗?

3 个答案:

答案 0 :(得分:6)

通常,传递指针的速度更快 - 您将调用equal(&r1, &r2),其中r1r2是本地struct变量。您可以将形式声明为const const结构的指针(这可以帮助optimizing compiler生成更高效的代码)。您也可以使用restrict关键字(如果您确定自己永远不会使用两个相同的指针调用equal,例如equal(&r1,&r1),即没有pointer aliasing)。

但是,某些特定的 ABIscalling conventions可能要求针对某些特定结构进行特定处理。例如,Linux的x86-64 ABI(和Unix SVR4)表示通过两个寄存器返回带有两个指针或整数值的struct 。这通常比使用寄存器中的指针修改存储区更快。 YMMV。

所以要知道什么是更快,你真的应该基准。但是,按值传递足够大的struct(例如,至少有4个整数或指针字段)几乎总是比将指针传递给它更慢。

BTW,当前台式机和笔记本电脑处理器真正重要的是CPU cache。将常用数据保存在L1或L2缓存中将提高性能。另请参阅this

答案 1 :(得分:3)

更快的速度在很大程度上取决于它在被调用函数中使用的struct 的大小。

如果您的结构不大于指针,则按值传递是最佳选择(需要复制的数据量较少或相等)。

如果你的结构大于指针,那么它在很大程度上取决于被调用函数内部的访问类型(并且在ABI细节上也是如此)。如果对结构进行了许多随机访问,那么传递值可能会更快,即使它大于指针,因为指针间接发生在函数内部。

总而言之,如果结构大于指针,你必须进行剖析以找出更快的结果。

答案 2 :(得分:0)

由于您自己说的原因,传递指针的速度更快。

实际上,在这种情况下,我发现C比C ++更具可读性:通过在调用中传递指针,您确认您的参数可能会被调用函数更改。使用C ++引用,您不能立即通过仅查看调用来表示,还必须检查调用的函数原型以查看它是否使用引用。