【发布时间】:2011-01-23 09:27:38
【问题描述】:
在数字代码中是否有一个通用的可移植习惯用法(我正在用 D 编写,但与语言无关,C 和 C++ 的答案对我也很有用),以确保所有频繁访问的堆栈分配双精度都是在 8 字节边界上对齐?我目前正在优化一些数字代码,其中未对齐的堆栈分配双精度数(仅在 4 字节边界上对齐)导致大约 1.5 到 2 倍的性能损失。
【问题讨论】:
标签: c++ c performance stack d
在数字代码中是否有一个通用的可移植习惯用法(我正在用 D 编写,但与语言无关,C 和 C++ 的答案对我也很有用),以确保所有频繁访问的堆栈分配双精度都是在 8 字节边界上对齐?我目前正在优化一些数字代码,其中未对齐的堆栈分配双精度数(仅在 4 字节边界上对齐)导致大约 1.5 到 2 倍的性能损失。
【问题讨论】:
标签: c++ c performance stack d
在 C++ 中,您可以使用 __declspec(align(#)),例如:
__declspec(align(32)) struct Str1{
int a, b, c, d, e; };
或更适合您正在寻找的内容,在 32 位边界上双对齐:
__declspec(align(32)) double a;
有一篇关于 windows here 上的数据对齐的好文章,你可能想看看。
【讨论】:
在“C”中,如果您不想依赖编译器选项或指令,可以使用联合来强制对齐:
#include <stdint.h>
typedef union _foo
{
uint64_t align;
double d;
} foo
这将保证您的双打是 64 位对齐的,只是让访问它们变得更加乏味。
或者,如果您不介意依赖编译器,gcc 支持 #pragma pack(64) 指令,该指令对所有内容强制执行 64 位对齐。
【讨论】:
double 和 uint64_t 将具有相同的对齐要求,即联合不会让你得到任何东西
这是特定于编译器的。使用 x86 上的 GCC,您可以使用
-malign-double
【讨论】:
double 声称受到了不公平的诽谤!
在 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"]));
}
【讨论】: