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

C 单独传递结构或其成员是否更快?,c,optimization,C,Optimization,如果我有 struct Foo { int A; int B; }; 哪个方法调用更快 void Bar(Foo MyFoo) 或 ? 或者它们是一样的?在这种情况下,它们是一样的 在函数中传递的参数越多,调用的代价就越高。这是由于每次调用时对堆栈进行多次推送造成的。传递完整结构与传递结构的每个单独部分相同。在这种情况下,应该使用指针和引用 正如paul所说,使用void BarFoo*MyFoo在本例中,它们是相同的 在函数中传递的参数越多,调用的代价就越高。这是由于每次调

如果我有

struct Foo
{
    int A;
    int B;
};
哪个方法调用更快

void Bar(Foo MyFoo)

?


或者它们是一样的?

在这种情况下,它们是一样的

在函数中传递的参数越多,调用的代价就越高。这是由于每次调用时对堆栈进行多次推送造成的。传递完整结构与传递结构的每个单独部分相同。在这种情况下,应该使用指针和引用


正如paul所说,使用void BarFoo*MyFoo在本例中,它们是相同的

在函数中传递的参数越多,调用的代价就越高。这是由于每次调用时对堆栈进行多次推送造成的。传递完整结构与传递结构的每个单独部分相同。在这种情况下,应该使用指针和引用


正如paul所说,使用void BarFoo*MyFoo通过引用使用内存地址要比通过值使用内存地址好。

通过引用使用内存地址要比通过值使用内存地址好。

这实际上取决于平台和编译器。尤其是当尺寸很小的时候

如果INT是16位的,则只需要一个32位的堆栈推送,这比64位体系结构上的指针小,但这些INT上的指针通常大于16位

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

当您进入更有趣的仍然很小的结构时,例如包含单个字符或位字段,传递结构可能会更快,即使是按值传递

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

与其他人一起插话;通过参考通常是最快的,但测量或检查生成的组件是确保手边平台的唯一方法


旁注:如果你进入C++域,事情会变得更复杂一些,但是你应该把结构作为一个const引用,它基本上是一个指针,但是给计算机更多的机会来聪明。p> 这实际上可能依赖于平台和编译器。尤其是当尺寸很小的时候

如果INT是16位的,则只需要一个32位的堆栈推送,这比64位体系结构上的指针小,但这些INT上的指针通常大于16位

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

当您进入更有趣的仍然很小的结构时,例如包含单个字符或位字段,传递结构可能会更快,即使是按值传递

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

与其他人一起插话;通过参考通常是最快的,但测量或检查生成的组件是确保手边平台的唯一方法


旁注:如果你进入C++域,事情会变得更复杂一些,但是你应该把结构作为一个const引用,它基本上是一个指针,但是给计算机更多的机会来聪明。p> 你应该试着自己计时。说过传递指向结构的指针可能会更快,例如void BarFoo*MyFoo。一定要传递指向结构的指针。@Paul Rooney使用void BarFoo*MyFoo的一个缺点是顶级MyFoo可以通过Bar进行更改。最好使用void Barconst Foo*MyFoo来实现与void BarFoo MyFoo和void Barint A,int B类似的功能。Oto,怀疑使用const会影响计时。答案取决于硬件、操作系统、编译器、优化级别、函数定义方式、函数大小、调用方式,参数的大小与硬件寄存器的大小相比较,等等。您应该自己尝试计时。说过传递指向结构的指针可能会更快,例如void BarFoo*MyFoo。一定要传递指向结构的指针。@Paul Rooney使用void BarFoo*MyFoo的一个缺点是顶级MyFoo可以通过Bar进行更改。最好使用void Barconst Foo*MyFoo来实现与void BarFoo MyFoo和void Barint A,int B类似的功能。Oto,怀疑使用const会影响计时。答案取决于硬件、操作系统、编译器、优化级别、函数定义方式、函数大小、调用方式,参数的大小与硬件寄存器的大小相比较,依此类推。

void Bar(int A, int B)