单独传递结构或其成员是否更快?

时间:2015-04-08 18:36:52

标签: c optimization

如果我有

struct Foo
{
    int A;
    int B;
};

哪种方法调用更快?

void Bar(Foo MyFoo)

void Bar(int A, int B)

或者它们是一样的吗?

3 个答案:

答案 0 :(得分:6)

这实际上可能与平台和编译器有关。特别是当sizeof(Foo)很小时。

如果整数是16位,则只需要一个32位的堆栈推送,这比64位架构上的指针小,但是这些整数通常超过16位。

作为单独的参数,每个参数都是一个单独的推送到堆栈,除非编译器做一些聪明的事情,......它经常这样做。在大多数现代平台上,这个结构可能只是一次推送到堆栈。

当你进入更小的有趣结构时,例如包含单个字符或位字段,传递结构可以更快,即使按值传递也是如此。

但这些是微不足道的差异,除非你在一个更接近旧计算器的平台而不是廉价的现代手机上工作。

与其他人一起休息;通过引用传递通常是最快的,但测量或检查生成的组件是确保手头平台的唯一方法。

旁注:如果你进入C ++领域,事情可能会变得更复杂,但是你应该把结构作为const引用传递,这基本上是一个指针,但是让计算机更有机会变得聪明。

答案 1 :(得分:1)

在这种情况下,它们是相同的。

您在功能中传递的参数越多,通话费用就越高。这是因为每次调用都会在堆栈上多次推送。传递完整结构与传递结构的每个单独部分相同。在这种情况下,您应该使用指针和引用。

如保罗所述,请使用void Bar(Foo* MyFoo)

答案 2 :(得分:-2)

花费内存地址(通过引用)比花费值(按值)更好。