4

頻繁にアクセスされるすべてのスタック割り当て double が 8 に整列されるようにするために、数値コードに一般的な移植可能なイディオムがありますか (私は D で書いていますが、言語に依存しない C および C++ の回答も私に役立ちます)。 -バイト境界?私は現在、スタックに割り当てられた倍精度浮動小数点数 (4 バイト境界でのみ整列) が正しく整列されていないために、約 1.5 倍から 2 倍のパフォーマンス ヒットを引き起こしているいくつかの数値コードを最適化しています。

4

4 に答える 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 に答える