C中的结构,它们有效吗?

pyg*_*iel 6 c performance struct

我正在读一些像这样的C代码:

double function( int lena,double xa,double ya, double za, double *acoefs, ...,
                 int lenb,double xb,double yb, double zb, double *bcoefs, ...,
                 same for c,
                 same for d )
Run Code Online (Sandbox Code Playgroud)

在函数中调用此函数的次数超过100.000次,因此它的性能至关重要.

我正在尝试扩展此代码,但我想知道它是否有效(以及这会影响速度)将所有参数封装在这样的结构中

struct PGTO { int len; double x,y,z ; double *acoefs }
Run Code Online (Sandbox Code Playgroud)

然后访问函数中的参数.

Nik*_*uhe 5

这个问题的答案在很大程度上取决于平台及其调用约定.它还取决于函数是否可以内联以及其他编译器优化.

我会说,在许多平台上,struct版本可能更高效,因为如果要将结构指针传递给结构,则要复制到堆栈的参数更少.

无论如何,这个问题不容易回答.因此,与所有性能考虑一样:只需测试和配置文件!


Rom*_*nko 5

首先,在这种情况下,使用结构似乎是正确的方法.代码将更容易阅读和unerstand,它也将变得不那么混乱.

将指针传递给结构通常比传递大量参数便宜.

  • 如果您每次调用函数时都需要填充结构,那就不一样了. (3认同)

jco*_*der 5

Visual C++ 2008 64位似乎通过让调用者为其堆栈上的结构副本分配空间并将数据项复制到其中然后将该副本的地址按值传递到函数中来传递结构.

这个简单的例子编译如下 -

struct data {
   int a;
   int b;
   int c;
   char d;
   float f;
};




double f2(data d)
{
    return d.a+d.b+d.c+d.d+d.f;
}
Run Code Online (Sandbox Code Playgroud)

编译到此 -

movsx   eax, BYTE PTR [rcx+12]
add eax, DWORD PTR [rcx+8]
add eax, DWORD PTR [rcx+4]
add eax, DWORD PTR [rcx]
movd    xmm0, eax
cvtdq2ps xmm0, xmm0
addss   xmm0, DWORD PTR [rcx+16]
unpcklps xmm0, xmm0
cvtps2pd xmm0, xmm0
ret 0
Run Code Online (Sandbox Code Playgroud)

所以基本上当你传递单个项目时,调用者将它们推入堆栈并且函数相对于堆栈访问它们.当你传递一个strcuture时,调用者将数据项复制到堆栈中的内存块中,然后将其地址传递给函数,该函数相对于它访问它们.

第二种方法有更多的汇编语言指令,但是就我而言,从我的测试中可以看出,除了几微秒​​之外,两种方法之间的效率没有显着差异.在我的所有测试中,编译器想要内联任何调用,除非我强迫它通过指针调用它,所以无论如何都可能在真实程序中没有任何东西通过堆栈传递.

在我看来,使用结构更清晰,速度似乎没有显着差异所以去那个:)

与往常一样,如果对性能有疑问,您需要分析您的确切设置