在數字代碼中有沒有常見的便攜式習慣用法(我正在用D編寫,但語言不可知,C和C++的答案對我也很有用),以確保所有經常訪問的堆棧分配的雙精度對齊在8字節邊界?我目前正在優化一些數字代碼,其中未對齊的堆棧分配雙打(僅在4字節邊界對齊)導致大約1.5到2倍的性能命中。8字節邊界對齊雙打?
4
A
回答
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位對齊。
4
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"]));
}
相關問題
- 1. NASM彙編字節邊界對齊
- 2. 對齊地址從一個8字節的邊界4個字節
- 3. 在16字節和32字節的邊界上對齊內存
- 4. 在未對齊的字節邊界上有效地打包10位數據
- 5. 如何將C結構與4字節邊界對齊?
- 6. 如何在GCC的32字節邊界對齊堆棧?
- 7. 大小字節邊界
- 8. 如何完美對齊沿着左右邊界線邊界
- 9. 軸對齊邊界框vs邊界橢圓
- 10. 字節對齊到奇數地址。它違反訪問邊界理論嗎?
- 11. 如何在編譯X86時防止函數對齊到16字節邊界?
- 12. 爲什麼對齊邊界大於4?
- 13. 讀取地址未在字邊界上對齊(MIPS)
- 14. 錯誤:「商店地址未在字邊界上對齊」
- 15. 我如何可以設置對齊邊框與其他邊界
- 16. 替代一個16字節邊界
- 17. 當malloc返回時,8字節對齊意味着什麼?
- 18. 「內存是8字節對齊」是什麼意思?
- 19. snprintf如何對齊字節
- 20. Morphic打破邊界
- 21. 什麼對準到16字節邊界中的x86
- 22. xcode中的對象字節對齊
- 23. 什麼postscript對象通常是8字節,但9字節打包?
- 24. 對齊邊框CSS
- 25. 打印UTF-8編碼的字節串
- 26. Android熱敏打印機不接受對齊字節
- 27. VBA無邊界打印
- 28. Windows屏幕邊界與雙顯示器
- 29. Python:將bin邊緣之間的條對齊爲雙直方圖
- 30. bootstrap 4對齊div的行和頂部邊界
請留下如果你打算給我投票,我可以理解爲什麼你覺得我的答案是eit她錯了或沒有幫助。 – SiegeX 2010-03-03 22:28:12
我不是那個投你一票的人,但最可能的原因是,對於大多數編譯器,'double'和'uint64_t'將具有相同的對齊要求,即工會不會獲得任何東西 – Christoph 2010-03-03 23:30:35