from:
因為今天和同事談到了arm平台下資料匯流排寬度及對齊方式對程式效率的影響問題
在定義結構資料型別時,為了提高系統效率,要注意字長對齊原則。
正好有點感觸給大家談談 本人水平有限的很有什麼問題請朋友指正:
本文主要給大家解釋下所謂的對齊到底是什麼?怎麼對齊?為什麼會對齊或者說對齊帶來什麼樣的效率差異?
1.先看下面的例子:
#include
#pragma pack(4)
struct a
;#pragma pack()
#pragma pack(1)
struct b
;#pragma pack()
int main()
a;2) 隨便怎麼寫,一切交給編譯器自動對齊。
還有一種將邏輯相關的資料放在一起定義
**中關於對齊的隱患,很多是隱式的。比如在強制型別轉換的時候。下面舉個例子:
unsigned int i = 0x12345678;
unsigned char *p=null;
unsigned short *p1=null;
p=&i;
*p=0x00;
p1=(unsigned short *)(p+1);
*p1=0x0000;
最後兩句**,從奇數邊界去訪問unsignedshort型變數,顯然不符合對齊的規定。
在x86上,類似的操作只會影響效率,但是在mips或者sparc上,可能就是乙個error
也談記憶體對齊
一 記憶體對齊的原因 大部分的參考資料都是如是說的 1 平台原因 移植原因 不是所有的硬體平台都能訪問任意位址上的任意資料的 某些硬體平台只能在某些位址處取某些特定型別的資料,否則丟擲硬體異常。2 效能原因 資料結構 尤其是棧 應該盡可能地在自然邊界上對齊。原因在於,為了訪問未對齊的記憶體,處理器需...
也談記憶體對齊 續
關於記憶體對齊的話題,始終是敏感的。稍有不慎,必將闖下大禍!最近專案稍顯輕閒,自己給自己安排一天反思和總結一下,突然想到以前寫過的一篇 也談記憶體對齊 那篇文章談的是記憶體對齊的基本知識以及一些實驗的資料,想必很多人看完後,會收穫一些東西,但是對記憶體對齊的應用還是處於懵懂狀態,其實大部分時間我們是...
pragma pack n 也談記憶體對齊
在最近的專案中,我們涉及到了 記憶體對齊 技術。對於大部分程式設計師來說,記憶體對齊 對他們來說都應該是 透明的 記憶體對齊 應該是編譯器的 管轄範圍 編譯器為程式中的每個 資料單元 安排在適當的位置上。但是 c語言的乙個特點就是太靈活,太強大,它允許你干預 記憶體對齊 記憶體對齊 對你就不應該再透...