tr1数组应该是16字节对齐吗?

时间:2012-01-04 00:14:10

标签: gcc sse tr1 memory-alignment

在“gcc版本4.2.1(基于Apple Inc. build 5658)(LLVM build 2335.15.00)”的tr1数组中,我看到了:

  value_type _M_instance[_Nm ? _Nm : 1] __attribute__((__aligned__)); 

而在“gcc version 4.5.2(Ubuntu / Linaro 4.5.2-8ubuntu4)”中,我看到了:

  value_type _M_instance[_Nm ? _Nm : 1];

也就是说,似乎不再将tr1数组指定为对齐(这会影响为它们编写的SSE代码)。我们的一些单元测试在_mm_load_ps中失败了。是否有任何关于这种变化的讨论?

1 个答案:

答案 0 :(得分:0)

规范未指定tr1::array是16字节对齐的。唯一的保证是数组将根据value_type的大小正确对齐。除非您在数组中存储的对象的大小是value_type对齐是16字节的倍数,否则您将无法获得希望使用SSE指令的128位对齐。如果您的现有代码依赖于一个编译器对所有array实例使用16字节对齐的事实,那么您应该修复它。您正在利用超出标准定义的行为,这非常脆弱。

如果您的代码依赖于它使用的内存上的特定对齐量,那么您应该在分配内存时明确强制执行该对齐;如果你改变编译器或平台,那么更少的东西容易出错。 A previous question解决了如何使tr1::array个对象使用对齐的内存。