在tr1数组中的"gcc 4.2.1版(基于苹果公司Build5658) (LLVM build 2335.15.00)“中,我看到了:
value_type _M_instance[_Nm ? _Nm : 1] __attribute__((__aligned__)); 而在"gcc 4.5.2 (Ubuntu/Linaro 4.5.2-8ubuntu4)版“中,我看到的是:
value_type _M_instance[_Nm ? _Nm : 1];也就是说,似乎tr1数组不再被指定为对齐的(这会影响为它们编写的SSE代码)。我们的一些单元测试在_mm_load_ps中失败了。有没有关于这一变化的讨论?
发布于 2012-01-05 00:02:53
规范没有指定tr1::array是16字节对齐的。唯一的保证是数组将根据value_type的大小正确对齐。除非存储在数组中的对象的大小是16字节的倍数,否则不会得到使用value_type指令所需的128位对齐。如果您的现有代码依赖于这样一个事实,即一个编译器对所有array实例使用16字节对齐,那么您应该修复它。您正在利用超出标准定义的行为,这是非常脆弱的。
如果您的代码依赖于它所使用的内存上的特定数量的对齐,那么您应该在分配内存时显式地强制执行这种对齐;否则,如果您更改编译器或平台,则很容易出现错误。A previous question解决了如何让tr1::array对象使用对齐内存的问题。
https://stackoverflow.com/questions/8720516
复制相似问题