c++中 基本資料型別的變數不能簡單的儲存於記憶體中的任意位址,他們的起始位址必須能被他們的大小整除。
typedef unsigned char byte;
enum color ;
struct eigth
{double m_price;
color m_color;
bool m_isshift;
bool m_bool;
byte m_byte;
//sizeof(eigth) =32
常常我們會去完全滿足它的自然對齊要求,同時會去滿足其每個成員的自然對齊要求,這是個非常浪費記憶體的行為。
那麼該怎麼樣去節省記憶體?
顯然是設法減少物件中的空洞,寧願讓末尾留下空洞,也不要讓中間留下空洞,盡量讓所有成員連續存放,
並將少末尾的填充位元組,
方法:安裝從大到小的順序從前到後依次宣告每乙個資料成員。並且盡量使用較小的成員對齊方式
修改後:
struct eigth
{bool m_bool;
color m_color;
bool m_isshift;
double m_price;
byte m_byte;
//sizeof(eigth) =16
呵呵, 挺誇張的
記憶體位址對齊
記憶體位址對齊,是一種在計算機記憶體中排列資料 訪問資料的一種方式,包含了兩種相互獨立又相互關聯的部分 基本資料對齊和結構體資料對齊。當今的計算機在計算機記憶體中讀寫資料時都是按字 word 大小塊來進行操作的 在32位系統中,資料匯流排寬度為32,每次能讀取4位元組,位址匯流排寬度為32,因此最大...
記憶體位址的對齊
3 有 pragma pack int 進行設定,如果結構體某成員的sizeof大於你設定的,則按你的設定來對齊 注意 每次用 pragma pack int 進行設定後,要用 pragma pack 對其結束,免得造成錯誤 view plain copy to clipboard print in...
記憶體位址對齊方式
對齊的作用和原因 各個硬體平台對儲存空間的處理上有很大的不同。一些平台對某些特定型別的資料只能從某些特定位址開始訪問。其他平台可能沒有這種情況,但是最常見的是如果不按照適合其平台的要求對資料存放進行對齊,會在訪問效率上帶來損失。比如有些平台每次讀都是從偶位址開始,如果乙個int型 假設為 32位 如...