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