对齐或不对齐堆栈上的char数组?

时间:2012-06-15 12:14:05

标签: c arrays char memory-alignment

我有以下代码:

char stats[109]; /* !LINE UNDER QUESTION! */
sprintf(stats,
    "OBJECTS:\n%u/256\n" \
    "BLOCKS:\n%u/" GP_ConstantExpand(Map_MaxLightmaps) "\n" \
    "QUADS:\n%u/" GP_ConstantExpand(Map_MaxLightmaps) "\n" \
    "LIGHTMAPS:\n%u/" GP_ConstantExpand(Map_MaxLightmaps) "\n" \
    "CHECKPOINTS:\n%u/256\n" \
    "HINTS:\n%u/256",
    Map_This_Header.objects, Map_This_Header.blocks, Map_This_QuadCount,
    lmapcount, Map_This_Header.checkpoints, Map_This_Header.hints);

静态分配109个字符的数组(109对于我的文本来说足够了),或者将数组对齐到128个字节会提高性能吗?

我不关心文件大小和内存使用,性能对我来说很重要,我的代码必须在旧计算机上以60 FPS运行。

2 个答案:

答案 0 :(得分:2)

我想这与代码运行的硬件有太多关联。我们可以考虑两个相反的参数来回答这个问题,假设在你的数组周围的堆栈上会分配其他变量:

  • 如果保持数组较小,则会减少用于保存所有常用变量的缓存条目数。
  • 如果您将大小对齐为2的幂,并且阵列的地址位于CPU的一个寄存器中,则根据CPU的寻址模式,可以更容易地计算后面的变量的地址。例如,ARM更容易编码像0x12000这样的偏移而不是0x12001,因为它采用了一个位域并将其移位。

然而,第二个参数似乎不太相关,因为它只会影响您可以实例化的众多变量中的一个变量。在任何情况下,如果您想确定,都需要对代码进行基准测试。

答案 1 :(得分:0)

如果对齐它会提高性能,编译器应该在适当的优化级别为您调整它。这是因为编译器可以自由地对自动变量进行排序和对齐。

一般情况下,除非您的代码实际要求将其对齐以进行操作(例如,如果您在指针字段的低位存储整数,从而需要实际的基指针与更大的边界对齐),你不应该将这样的假设编码到你的代码中。