Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 阵列处理中的性能差异_C_Memory_Struct_Runtime - Fatal编程技术网

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个字节。处理时间以纳秒为单位。没有人会注意到它是快半纳秒还是慢半纳秒。