繁体   English   中英

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

[英]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) ,其中r1r2是局部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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM