【问题标题】:Performance differences in array handling [closed]数组处理的性能差异[关闭]
【发布时间】:2012-11-05 15:49:39
【问题描述】:

我有这个代码:

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

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

【问题讨论】:

  • 您的数组使用 16 个字节。处理时间将是纳秒级。没有人会注意到它是快了还是慢了半纳秒。

标签: c memory struct runtime


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

    编辑:

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

    【讨论】:

      【解决方案3】:

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

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

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

      【讨论】:

        猜你喜欢
        • 2011-08-08
        • 1970-01-01
        • 2020-05-30
        • 2018-11-15
        • 1970-01-01
        • 2020-11-16
        • 2016-07-15
        • 2012-03-15
        • 2011-10-29
        相关资源
        最近更新 更多