我很困惑,因为我有一段时间没有写过C.在C ++中,我们将它们作为引用传递,以便不复制整个结构。这也适用于C吗?我们是否应该将它们作为指针传递,即使我们不想修改它们,以避免复制?
换句话说,对于检查两个结构是否相等的函数,我们最好做
int equal(MyRecord* a, MyRecord* b);
并降低一点可读性(因为指针)
或
int equal(MyRecord a, MyRecord b);
会有相同的表现吗?
答案 0 :(得分:6)
通常,传递指针的速度更快 - 您将调用equal(&r1, &r2)
,其中r1
和r2
是本地struct
变量。您可以将形式声明为const
const
结构的指针(这可以帮助optimizing compiler生成更高效的代码)。您也可以使用restrict
关键字(如果您确定自己永远不会使用两个相同的指针调用equal
,例如equal(&r1,&r1)
,即没有pointer aliasing)。
但是,某些特定的 ABIs和calling conventions可能要求针对某些特定结构进行特定处理。例如,Linux的x86-64 ABI(和Unix SVR4)表示通过两个寄存器返回带有两个指针或整数值的struct
。这通常比使用寄存器中的指针修改存储区更快。 YMMV。
所以要知道什么是更快,你真的应该基准。但是,按值传递足够大的struct
(例如,至少有4个整数或指针字段)几乎总是比将指针传递给它更慢。
答案 1 :(得分:3)
更快的速度在很大程度上取决于它在被调用函数中使用的struct 和的大小。
如果您的结构不大于指针,则按值传递是最佳选择(需要复制的数据量较少或相等)。
如果你的结构大于指针,那么它在很大程度上取决于被调用函数内部的访问类型(并且在ABI细节上也是如此)。如果对结构进行了许多随机访问,那么传递值可能会更快,即使它大于指针,因为指针间接发生在函数内部。
总而言之,如果结构大于指针,你必须进行剖析以找出更快的结果。
答案 2 :(得分:0)
由于您自己说的原因,传递指针的速度更快。
实际上,在这种情况下,我发现C比C ++更具可读性:通过在调用中传递指针,您确认您的参数可能会被调用函数更改。使用C ++引用,您不能立即通过仅查看调用来表示,还必须检查调用的函数原型以查看它是否使用引用。