【问题标题】:Aligning doubles on 8-byte boundaries?在 8 字节边界上对齐双精度数?
【发布时间】:2011-01-23 09:27:38
【问题描述】:

在数字代码中是否有一个通用的可移植习惯用法(我正在用 D 编写,但与语言无关,C 和 C++ 的答案对我也很有用),以确保所有频繁访问的堆栈分配双精度都是在 8 字节边界上对齐?我目前正在优化一些数字代码,其中未对齐的堆栈分配双精度数(仅在 4 字节边界上对齐)导致大约 1.5 到 2 倍的性能损失。

【问题讨论】:

    标签: c++ c performance stack d


    【解决方案1】:

    在 C++ 中,您可以使用 __declspec(align(#)),例如:

        __declspec(align(32)) struct Str1{
       int a, b, c, d, e;    };
    

    或更适合您正在寻找的内容,在 32 位边界上双对齐:

    __declspec(align(32)) double a;
    

    有一篇关于 windows here 上的数据对齐的好文章,你可能想看看。

    【讨论】:

      【解决方案2】:

      在“C”中,如果您不想依赖编译器选项或指令,可以使用联合来强制对齐:

      #include <stdint.h>
      
      typedef union _foo
      {
        uint64_t align;
        double d;
      } foo
      

      这将保证您的双打是 64 位对齐的,只是让访问它们变得更加乏味。

      或者,如果您不介意依赖编译器,gcc 支持 #pragma pack(64) 指令,该指令对所有内容强制执行 64 位对齐。

      【讨论】:

      • 如果您要对我投反对票,请留下评论,以便我理解您为什么觉得我的回答错误或没有帮助。
      • 我不是投票给你的人,但最可能的原因是对于大多数编译器,doubleuint64_t 将具有相同的对齐要求,即联合不会让你得到任何东西
      【解决方案3】:

      这是特定于编译器的。使用 x86 上的 GCC,您可以使用

      -malign-double
      

      【讨论】:

      • 这只是在:double 声称受到了不公平的诽谤!
      【解决方案4】:

      在 D 中你可能想尝试 align 属性或 alignForSize 库函数

      http://www.digitalmars.com/d/2.0/attribute.html#align

      struct S
      {   align(4) byte a;    // placed at offset 0
          align(4) byte b;    // placed at offset 1
      }
      
      align (1) struct S
      {   byte a; // placed at offset 0
          byte[3] filler1;
          byte b; // placed at offset 4
          byte[3] filler2;
      }
      

      http://www.digitalmars.com/d/2.0/phobos/std_typecons.html#alignForSize

      struct Banner {
        mixin(alignForSize!(byte[6], double)(["name", "height"]));
      }
      

      【讨论】:

        猜你喜欢
        • 2014-09-21
        • 2023-03-25
        • 2013-01-31
        • 2016-12-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多