[英]How should I pass a struct in a function?
我很困惑,因为我有一段时间没有写过C. 在C ++中,我们将它们作为引用传递,以便不复制整个结构。 这也适用于C吗? 我们应该将它们作为指针传递,即使我们不想修改它们,以避免复制?
换句话说,对于检查两个结构是否相等的函数,我们最好这样做
int equal(MyRecord* a, MyRecord* b);
并减少一点可读性(因为指针)
要么
int equal(MyRecord a, MyRecord b);
会有相同的表现吗?
通常,传递指针更快 - 你将调用equal(&r1, &r2)
,其中r1
和r2
是局部struct
变量。 您可以将形式声明为const
结构的const
指针(这可以帮助优化编译器生成更高效的代码)。 你也可以使用restrict
关键字(如果你确定你永远不会用两个相同的指针调用你的equal
,例如equal(&r1,&r1)
,即没有指针别名 )。
但是,某些特定的 ABI和调用约定可能要求对某些特定结构进行特殊处理。 例如, X86-64 ABI为Linux(和Unix SVR4)说,一个struct
与两个指针或积分值将直通两个寄存器被返回。 这通常比使用寄存器中的指针修改存储区更快。 因人而异。
所以要知道什么是更快,你真的应该基准。 但是,按值传递足够大的struct
(例如,至少有4个整数或指针字段)几乎总是比将指针传递给它要慢。
顺便说一下,当前台式机和笔记本电脑处理器真正重要的是CPU缓存 。 将常用数据保存在L1或L2缓存中将提高性能。 另请参见本 。
什么是更快的大大取决于结构的大小和它在被调用函数内的使用。
如果您的结构不大于指针,则按值传递是最佳选择(需要复制的数据量较少或相等)。
如果你的结构大于指针,那么它在很大程度上取决于被调用函数内部的访问类型(并且在ABI细节上也是如此)。 如果对结构进行了许多随机访问,则传递值可能更快,即使它大于指针,因为指针间接发生在函数内部。
总而言之,如果结构大于指针,则必须进行分析以找出更快的结果。
由于你自己说的原因,传递指针更快。
实际上,在这种情况下,我发现C比C ++更具可读性:通过在调用中传递指针,您确认您的参数可能会被调用函数更改。 使用C ++引用时,您不能立即通过仅查看调用来说明,您还必须检查调用的函数原型以查看它是否使用引用。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.