当C函数必须返回多个值时,有几种方法可以做到这一点.

Right now I'm interested in the relative efficiency of two of those methods:
a) bundle the values in a struct foo. Populate a local foo, and return that.
b) pass pointers to be populated.

(我正在编写一些混合了两者的遗留代码.)

就本帖子而言:

  • 所有返回值都是基元.Int‘s、指针值等.因此sizeof(Foo)非常小.
  • 让struct Foo变得不透明并不是一个问题.
  • 有问题的函数最多有12个参数,包括任何从PTR到返回值的参数.
  • 假设有一点现代的编译器,例如GCC 11或更高版本.

Obviously inlining would make the question moot.
Can the different methods affect the compiler's ability to inline?
If not inlined, will there be a performance difference between the two methods?

在函数参数中放置指向返回值的指针参数会有影响吗?是基于编译器的内联能力,还是基于非内联性能?

为清楚起见,编辑(A).

推荐答案

This is ABI specific.

Linux / x86-64上,在两个寄存器中返回恰好具有两个字的struct(例如,两个指针或两个intptr_t或两个long-S).这比比方说malloc快得多.

但是内联函数并不总是更快.您还可以使用部分求值技术或C++代码生成(如在RefPerSys中)

使用最新的GCC编译器,还可以考虑使用链接时间优化(例如-flto -O2)编译所有C或C++文件and linking

C++相关问答推荐

了解一些CLIPS原语数据类型

无效使用未定义类型'structsquare'?

C中出现分段错误后关闭文件

编译的时候g++通常会比GCC慢很多吗?

在C++中使用函数指针的正确语法

插座打开MacOS组件

变量的作用域是否在C中的循环未定义行为或实现定义行为的参数中初始化?

搜索使用int代替time_t的用法

如何在不使用字符串的情况下在c中编写函数atof().h>;

链接器脚本和C程序使用相同的头文件,这可能吗?

为什么我的二叉树删除删除整个左部分的树?

如何组合两个宏来初始化C语言中的字符串数组?

如何使用WRITE()以指针地址的十六进制形式写入标准输出

存储和访问指向 struct 的指针数组

try 判断长整数是否为素数

我可以使用Windows SDK';s IN6_IS_ADDR_LOOPBACK等,尽管没有文档?

令人困惑的返回和 scanf 问题相关

malloc:损坏的顶部大小无法找出问题

C 中类型说明符的顺序重要吗?

如何根据当前舍入方向将float转换为int?