C 阵列处理中的性能差异
我有以下代码:C 阵列处理中的性能差异,c,memory,struct,runtime,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 <
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;
}
为什么第二个代码的性能更好?在第一个代码中,结构arrstuct由value使用,因此,在函数printSizeOfArray中,结构的成员a不会转换为指针。因此,堆栈上将有4*sizeofint-sizeofint*加上更多的潜在填充字节。检查生成的程序集,以了解第一个或第二个代码是否更有效
从理论上讲,第二个代码会运行得更快,因为解除保护的次数更少。但是,启用优化后,没有显著差异。我怀疑启用优化后两者之间会有很大差异。但你为什么要这样编码呢。您认为包含数组的结构比数组有什么优势?除非您想向结构添加更多内容,否则只需使用数组即可 编辑:
。。。仔细想想,您的代码是“打印数组的大小”吗?您的第二个代码不完整粘贴错误?但是数组的大小在函数中并不明显,而结构的大小以及它的数组的大小则会明显 唯一合理的性能问题可能是在printSizeOfArray中,ArrStruct是按值传递的。这意味着调用函数时将复制它,这是不必要的。如果通过指针传递参数,则此问题将消失:
vaid printSizeOfArray(ArrStruct *arrStruct)
{
printf("%lu\n", sizeof(arrStruct->a));
++(arrStruct->a[2]);
}
此外,采用数组的可选printSizeOfArray函数将无法正常工作。该参数最终被解释为int*,然后函数中的sizeof计算不会执行预期的操作。数组使用16个字节。处理时间以纳秒为单位。没有人会注意到它是快半纳秒还是慢半纳秒。