在數字代碼中有沒有常見的便攜式習慣用法(我正在用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. 爲什麼雙對齊到8字節邊界,而不是4個字節
- 2. NASM彙編字節邊界對齊
- 3. 對齊地址從一個8字節的邊界4個字節
- 4. 在16字節和32字節的邊界上對齊內存
- 5. 在未對齊的字節邊界上有效地打包10位數據
- 6. 如何在GCC的32字節邊界對齊堆棧?
- 7. 如何將C結構與4字節邊界對齊?
- 8. 如何在4字節邊界對齊掃描線
- 9. 大小字節邊界
- 10. 軸對齊邊界框vs邊界橢圓
- 11. 如何完美對齊沿着左右邊界線邊界
- 12. 如何在編譯X86時防止函數對齊到16字節邊界?
- 13. 字節對齊到奇數地址。它違反訪問邊界理論嗎?
- 14. 什麼意思錯誤:...在Xcode/Clang中的「字節到對齊邊界」?
- 15. *邊界框內的文本對齊*
- 16. 爲什麼對齊邊界大於4?
- 17. 加密和字節字符串邊界
- 18. 錯誤:「商店地址未在字邊界上對齊」
- 19. 讀取地址未在字邊界上對齊(MIPS)
- 20. MIPS - 讀取地址在字邊界上不對齊
- 21. 字邊界後如何打印字符
- 22. 雙轉換成8個字節數組
- 23. 雙邊連接邊界列表
- 24. 我如何可以設置對齊邊框與其他邊界
- 25. 替代一個16字節邊界
- 26. Vala中的字節對齊
- 27. 16字節對齊問題
- 28. snprintf如何對齊字節
- 29. 當malloc返回時,8字節對齊意味着什麼?
- 30. XCode 32位無法設置8字節對齊?
請留下如果你打算給我投票,我可以理解爲什麼你覺得我的答案是eit她錯了或沒有幫助。 – SiegeX 2010-03-03 22:28:12
我不是那個投你一票的人,但最可能的原因是,對於大多數編譯器,'double'和'uint64_t'將具有相同的對齊要求,即工會不會獲得任何東西 – Christoph 2010-03-03 23:30:35