【问题标题】:Is tr1 array supposed to be 16 byte aligned?tr1 数组应该是 16 字节对齐的吗?
【发布时间】:2012-01-04 00:14:09
【问题描述】:

在 tr1 数组中的“gcc 版本 4.2.1(基于 Apple Inc. build 5658)(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 中失败了。是否有任何地方讨论过这种变化?

【问题讨论】:

  • 它们将与value_type 对齐。如果您需要除此之外的任何内容,则必须自己添加。请注意,这不是任何标准的一部分,也不是纯粹的编译器特定问题。

标签: gcc sse tr1 memory-alignment


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-28
    • 1970-01-01
    • 2015-09-02
    • 2023-04-08
    • 2013-05-18
    • 1970-01-01
    相关资源
    最近更新 更多