2012-06-15 80 views
-1

我有以下代码:对齐或不对齐堆栈上的char数组?

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运行。

+3

由于性能对您至关重要。唯一的方法就是测试两种方法并在您的环境中对它们进行配置。这将为您提供比您明智的猜测更准确的评估结果,您将得到此处。 –

+1

如果您关心性能,为什么要做一些文本格式的加载? – Rook

+0

此外,不关心内存使用也可能会损害性能,如果你开始获取缓存未命中,因为你有太多的数据不适合缓存空间... – Rook

回答

2

我想这是代码将运行的硬件太多相关。我们能想到的两个相反的论点实例来回答这个问题,假设会出现在你的阵列在栈上分配的其他变量:

  • 如果保持阵列小,这将减少用于缓存条目的数量保存所有经常使用的变量。
  • 如果您在两个幂的位置对齐大小,并且阵列的地址位于CPU的一个寄存器中,根据CPU的寻址模式计算变量的地址可能会更容易一些。例如,ARM对0x12000之类的偏移量进行编码比0x12001更容易,因为它需要一个位域并对其进行移位。

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

+0

处理器是x86。 – Triang3l

0

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

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