阵列处理的性能差异

时间:2012-11-05 15:49:40

标签: c memory struct runtime

我有这段代码:

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;
}

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

3 个答案:

答案 0 :(得分:1)

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

理论上,第二个代码运行得更快,因为derefences更少。但是,在启用优化的情况下,没有明显的差异。

答案 1 :(得分:1)

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

编辑:

......第二个想法,你的代码是'打印数组的大小'?你的第二个代码是不完整的(粘贴错误?)但是数组的大小在函数内部并不明显,而结构的大小因此它的数组也是如此。

答案 2 :(得分:1)

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

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

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