2009-07-06 124 views
6

重要:请参阅以下非常相关的问题:Return multiple values in C++从C函数返回多个值

我在如何在ANSI C中做同样的事情?你会使用一个结构或传递函数中的参数地址吗?即使是以可读性为代价,我仍然是在非常高效(快速)代码(时间和空间)之后。

编辑:感谢所有的答案。好的,我认为我欠缺了一些解释:我正在撰写关于某个特定域的某些算法子集的书。我已经为自己设定了一个相当武断的目标,即以可读性和其他方式为代价,为我所有的算法提供最高效率(时间和空间)的实现。这部分是我的(一般)问题的性质。

:我希望我就直,从(可能)最快多见无意义的(这一切是先验的,即没有测试):在全球对象

  1. 商店outvalues(我)或
  2. 在函数中传递outvalues作为参数(foo(int in,int * out1,int * out2)),或者
  3. 返回一个结构同时具有两个outvals,或者
  4. (3)只有当这些值在语义上相关时。

这是否有意义?如果是这样,我认为杰森的回应是最接近的,尽管他们都提供了一些“难题”。罗伯特的很好,但在这个时候语义并不是我所追求的(尽管他的建议被适当注意到)

谢谢大家。

+3

无情地编写代码和配置文件。我认为你会发现struct-vs-reference对性能的影响与其他实现相比*非常小,甚至不值得考虑。 – 2009-07-06 19:55:31

+0

这也是很好的建议。谢谢。 (顺便说一句,我的确让你赞不绝口,所以恰巧我得到了更实际的答案,就是这样。) – 2009-07-06 20:12:18

+0

我知道。谢谢。 – 2009-07-07 01:19:32

回答

5

正如尼尔说,你需要判断它自己。

为了避免传递任何东西的代价,请使用全局。接下来最好的是通过指针/引用传递的单个结构。之后是单独的指针/参考参数。

但是,如果你将数据打包到结构,然后读取它的电话后回来了,你可能会更好传递各个参数。

如果你不知道,只用两种方法写一点快速测试代码,执行每几十万次,时间,看看哪一个是最好的。

3

您已经描述了两种可能的解决方案和您感知的性能约束。你从哪里出发真的取决于你 - 我们没有足够的信息做出明智的判断。

1

最快Q & D我可以想到的方式是将值传递给全局对象,这样就可以跳过堆栈操作,只要记住它不会是线程安全的。

0

我会将地址传递给结构体。如果要返回的信息不是很复杂,那么只需将地址传递给值就可以。个人而言,它真的归结为界面会有多混乱。

void SomeFunction(ReturnStruct* myReturnVals) 
{ 
    // Fill in the values 
} 

// Do some stuff  
ReturnStruct returnVals; 
SomeFunction(&returnVals);  
// Do more stuff 
7

这两种方法都是有效的,certianly,但我会考虑语义(结构VS参数指令),以决定哪种方式最好传达你的意图给程序员。

如果您返回的值紧密耦合,那么可以将它们作为结构返回。但是,如果只是简单地创建人工机制以将值返回(作为结构体),则应该使用参数引用(即传递变量的地址)将值返回给调用函数。

享受,

罗伯特C. Cartaino

3

最容易阅读应该在函数传递地址,应该也快,持久性有机污染物,并推动价格便宜:

void somefunction (int inval1, int inval2, int *outval1, int *outval2) { 
    int x = inval1; 
    int y = inval2; 
// do some processing 
    *outval1 = x; 
    *outval2 = y; 
    return; 
} 
0

这大规模取决于你的架构,并且如果你还期望(或者可以有)内联功能。我首先以最简单的方式编写代码,然后担心速度,如果这显示为代码的昂贵部分。

1

我认为,当你返回一个结构指针时,你可能需要手动找到一些内存。参数列表中的地址分配在堆栈上,速度更快。

0

无论哪种情况,您都要传递引用,所以性能应该类似。如果函数有可能实际上没有返回值,那么可以通过“return a struct”选项避免malloc的开销,因为您只需返回null。

我个人的偏好是返回一个动态分配的(malloc'd)结构。我避免使用函数参数来输出,因为我认为它会使代码更加混乱,并且长期维护更少。

1

请记住,有时是更快地通过值和更新参数的回报(或使堆栈上的本地副本)比参考...这是小结构或几个参数和大量的访问非常明显。

-1

返回结构的本地副本是不好的,因为如果该结构被宣布为在函数内部的非静态,​​就变成零,一旦你退出函数void。

和所有乡亲暗示引用,以及在OP确实说过“C”,而C没有他们(引用)。

和甜羽毛状耶稣,我可以明天醒来,并没有看到有关触发器的电视国王什么?