2010-03-03 58 views
4

在數字代碼中有沒有常見的便攜式習慣用法(我正在用D編寫,但語言不可知,C和C++的答案對我也很有用),以確保所有經常訪問的堆棧分配的雙精度對齊在8字節邊界?我目前正在優化一些數字代碼,其中未對齊的堆棧分配雙打(僅在4字節邊界對齊)導致大約1.5到2倍的性能命中。8字節邊界對齊雙打?

回答

2

在C++中,你可以使用__declspec(align(#))像:

__declspec(align(32)) struct Str1{ 
    int a, b, c, d, e; }; 

或更適合你在找什麼,雙32位邊界上對齊:

__declspec(align(32)) double a; 

有一個很好的文章關於窗口here上的數據對齊,您可能需要檢查它。

3

在「C」你可以使用一個工會,迫使定位,如果你不希望依靠編譯器選項或指令:

#include <stdint.h> 

typedef union _foo 
{ 
    uint64_t align; 
    double d; 
} foo 

這將保證您的雙打是64位對齊,它只是使訪問他們更乏味。

或者,如果您不介意依賴編譯器,gcc支持#pragma pack(64)指令,該指令爲所有內容強制執行64位對齊。

+0

請留下如果你打算給我投票,我可以理解爲什麼你覺得我的答案是eit她錯了或沒有幫助。 – SiegeX 2010-03-03 22:28:12

+2

我不是那個投你一票的人,但最可能的原因是,對於大多數編譯器,'double'和'uint64_t'將具有相同的對齊要求,即工會不會獲得任何東西 – Christoph 2010-03-03 23:30:35

4

這是編譯器特定的。隨着x86的GCC,你會使用

-malign-double 
+3

這只是:'雙'聲稱遭到不公正的誹謗! – caf 2010-03-03 22:37:13

1

在d,你可能想嘗試對齊屬性或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"])); 
}