4

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

4

4 回答 4

4

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

#include <stdint.h>

typedef union _foo
{
  uint64_t align;
  double d;
} foo

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

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

于 2010-03-03T21:07:40.727 回答
4

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

-malign-double
于 2010-03-03T21:59:10.197 回答
2

在 C++ 中,您可以像这样使用__declspec(align(#))

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

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

__declspec(align(32)) double a;

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

于 2010-03-03T20:33:19.277 回答
1

在 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"]));
}
于 2010-03-04T10:13:33.267 回答