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

gsa*_*ras 3 c struct pointers reference

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

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

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

并减少一点可读性(因为指针)

要么

int equal(MyRecord a, MyRecord b);

会有相同的表现吗?

Bas*_*tch 6

通常,传递指针的速度更快 - 您将调用equal(&r1, &r2)where r1r2local struct变量.您可以将形式声明为const指向const结构的指针(这可以帮助优化编译器生成更高效的代码).你也可以使用restrict关键字(如果你确定你永远不会equal用两个相同的指针调用你,例如equal(&r1,&r1),没有指针别名).

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

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

顺便说一下,当前台式机和笔记本电脑处理器真正重要的是CPU缓存.将常用数据保存在L1或L2缓存中将提高性能.另请参见.