我有这段代码:
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;
}
为什么第二个代码会有更好的性能?
答案 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
计算不能完成预期的事情。