-4

我有这个代码:

typedef struct
{
int a[4];
} ArrStruct;

void printSizeOfArray(ArrStruct arrStruct)
{
printf("%lu\n", sizeof(arrStruct.a));
++(arrStruct.a[2]);
}

int main()
{

int it;
ArrStruct arrStruct;
printSizeOfArray(arrStruct);

for (it = 0 ; it < sizeof(arrStruct.a)/sizeof(int); ++it)
{
printf("%d, ", arrStruct .a[it]);
}

return 0;
}

有人告诉它,与下一个代码相比,它没有良好的运行时/内存性能。有什么区别?

void printSizeOfArray(int a[])

{
printf("%lu\n", sizeof(a));
++(a[2]);
}

int main()
{

int it;
int a[4] = {0};
printSizeOfArray(a);
for (it = 0 ; it < sizeof(a)/sizeof(int) ; ++it)
{
printf("%d, ", a[it]);
}
return 0;
}

为什么第二个代码会有更好的性能?

4

3 回答 3

1

唯一合理的性能问题可能是printSizeOfArrayArrStruct值传递。这意味着它将在调用函数时被复制,这是不必要的。如果你通过指针传递参数,这个问题就会消失:

vaid printSizeOfArray(ArrStruct *arrStruct)
{
   printf("%lu\n", sizeof(arrStruct->a));
   ++(arrStruct->a[2]);
}

printSizeOfArray此外,采用数组的替代函数将无法正常工作。该参数最终被解释为 a int*,然后sizeof函数中的计算不会做预期的事情。

于 2012-11-05T16:08:50.500 回答
1

我怀疑打开优化后两者之间会有很大差异。但是你为什么要这样编码呢。你认为包含数组的结构比数组有什么优势?除非您想向结构添加更多内容,否则只需使用数组即可。

编辑:

...再想一想,您的代码是“打印数组的大小”?您的第二个代码不完整(粘贴错误?),但数组的大小在函数内部不会明显,而结构的大小及其数组会。

于 2012-11-05T15:55:05.687 回答
1

在第一个代码中,结构ArrStruct是按值使用的,因此,在函数中printSizeOfArray,结构的成员a不会被转换为指针。所以堆栈上会有4 * sizeof(int) - sizeof(int *)更多(加上潜在的填充字节)。检查生成的程序集,以了解第一个代码还是第二个代码更有效。

理论上,第二个代码会运行得更快,因为取消引用更少。但是,启用优化后,没有显着差异。

于 2012-11-05T15:53:31.640 回答