在8字节边界上对齐双倍?

时间:2010-03-03 20:15:59

标签: c++ c performance stack d

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

4 个答案:

答案 0 :(得分:4)

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

-malign-double

答案 1 :(得分:3)

如果您不想依赖编译器选项或指令,在'C'中您将使用union来强制对齐:

#include <stdint.h>

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

这样可以保证你的双打是64位对齐的,只是让访问它们更加乏味。

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

答案 2 :(得分:2)

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

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

或更适合您要查找的内容,在32位边界上进行双重对齐:

__declspec(align(32)) double a;

关于Windows here的数据对齐有一篇很好的文章,您可能想要查看它。

答案 3 :(得分:1)

在D中你可能想尝试对齐属性或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"]));
}