如果不改編譯選項delphi的record預設也是4位元組對齊的.
可以用編譯開關指定
就是4位元組對齊.同理.等.等同於packed record
主要容易被忽略的是delphi的列舉.
c,c++的列舉預設等同於整數.也就是4位元組的.
delphi列舉預設是最小對齊.也就是除非指定列舉值,如果列舉小於255個就乙個位元組.大於255小於65535就兩個位元組等.
可以用這個編譯開關把列舉強制按4位元組對齊.
在結構體中,成員資料對齊滿足以下規則:
a、結構體中的第乙個成員的首位址也即是結構體變數的首位址。
b、結構體中的每乙個成員的首位址相對於結構體的首位址的偏移量(offset)是該成員資料型別大小的整數倍。
c、結構體的總大小是對齊模數(對齊模數等於#pragma pack(n)所指定的n與結構體中最大資料型別的成員大小的最小值)的整數倍。
位段(也叫位域)這種資料型別在記憶體中的對齊。乙個位域必須儲存在同乙個位元組中,不能跨位元組,比如跨兩個位元組。如果乙個位元組所剩空間不夠儲存另一位位域時,應該從下乙個位元組存放該位域。在滿足成員資料對齊的規則下,還滿足如下規則:
d、如果相鄰位域型別相同,並且它倆位域寬度之和小於它的資料型別大小,則後面的字段緊鄰前面的字段儲存。
e、如果相鄰位域型別相同,但是它倆位域寬度之和大於它的資料型別大小,則後面的字段將從新的儲存單元開始,其偏移量為其型別的整數倍。
f、如果相鄰位域型別不同,在vc中是不採取壓縮方式,但是gcc會採取壓縮方式。
位元組順序 位元組對齊
一.位元組順序的產生 在計算機中,資料是以位元組為單位存放的,而c語言中只有char才是乙個位元組,其他如int,float都是大於乙個位元組,所以就存在將資料按怎樣的順序存放的問題。一般有大端序和小端序兩種方式,特殊的還有混合序,也就是兩種存放方式同時存在於乙個計算機系統中。上面講的都是主機位元組...
位元組順序 位元組對齊
一.位元組順序的產生 在計算機中,資料是以位元組為單位存放的,而c語言中只有char才是乙個位元組,其他如int,float都是大於乙個位元組,所以就存在將資料按怎樣的順序存放的問題。一般有大端序和小端序兩種方式,特殊的還有混合序,也就是兩種存放方式同時存在於乙個計算機系統中。上面講的都是主機位元組...
位元組對齊 8位元組對齊
參考博文 參考1 參考2 參考3 在記憶體管理中經常使用位元組對齊來管理分配的記憶體。1 原理 2 演算法 2.1unsigned intcalc align unsigned int n,unsigned align 2.2 更好的演算法 unsigned intcalc align unsign...