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