頻繁にアクセスされるすべてのスタック割り当て double が 8 に整列されるようにするために、数値コードに一般的な移植可能なイディオムがありますか (私は D で書いていますが、言語に依存しない C および C++ の回答も私に役立ちます)。 -バイト境界?私は現在、スタックに割り当てられた倍精度浮動小数点数 (4 バイト境界でのみ整列) が正しく整列されていないために、約 1.5 倍から 2 倍のパフォーマンス ヒットを引き起こしているいくつかの数値コードを最適化しています。
1367 次
4 に答える
4
これはコンパイラ固有です。x86 で GCC を使用する場合は、
-malign-double
于 2010-03-03T21:59:10.197 に答える
4
「C」では、コンパイラ オプションやディレクティブに依存したくない場合は、ユニオンを使用してアライメントを強制します。
#include <stdint.h>
typedef union _foo
{
uint64_t align;
double d;
} foo
これにより、double が 64 ビットでアラインされていることが保証されますが、それらへのアクセスが少し面倒になります。
代わりに、コンパイラに依存しても構わない場合、gcc は#pragma pack(64)
すべてに対して 64 ビット アラインメントを強制するディレクティブをサポートしています。
于 2010-03-03T21:07:40.727 に答える
2
C ++では、次のように__declspec(align(#))を使用できます。
__declspec(align(32)) struct Str1{
int a, b, c, d, e; };
または、探しているものにより適切で、32ビット境界に二重に配置されます。
__declspec(align(32)) double a;
ここにウィンドウのデータアラインメントについての素晴らしい記事があります、あなたはそれをチェックしたいかもしれません。
于 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 に答える