程式設計師寶典中,關於結構體對齊問題,看了一晚上帖子,包括記憶體,cpu等等的,現在總算有些理解
要弄清結構體對齊,首先要明白為什麼要對齊?
1. 先想想簡單的hello.c整個執行過程中外設,記憶體,cpu的工作過程
計算機的所有工作都是要經過記憶體的,包括網頁得讀取等等
我們平時說的32位機器是指指令和資料是32位的,可以處理的資料量的增大。64位機時通用暫存器的位數,同時位址編碼也是,這樣定址方位就增大。
2. cpu在讀取記憶體時,是把記憶體看成是一塊塊的,如2,4,8,16個位元組的塊。
這樣的話,假如把乙個int 型別的資料儲存到1位址時候,就要先讀出前四個位元組,然後再讀出四個位元組,就需要讀出兩次,而且對有的處理器來說,根本不支援這種方法。
所以,為了提高效率,避免有些不支援多次讀取的處理器錯誤,需要進行記憶體對齊。
記憶體對齊跟作業系統,編譯器,計算機有關的,一般情況下在vc裡預設的對齊方式是#pragma
pack(n)
2. 整個結構的大小之和,必須是q(取n和各個sizeof(type)中的最大者中的較小者)的倍數------避免結構陣列帶來的問題
可以指定對齊規則,當指定的對齊規則太大時候,發揮不了作用。
最好使用時候指定對齊規則,#pragma pack(push) 指定 #pragma pack(pop)
這樣的話避免因為在不同機器系統上讀取結構時,因為記憶體對齊帶來的不可移植性。
參考:英文** http://www.ibm.com/developerworks/library/pa-dalign/
關於結構體內存對齊方式
結構體的對齊方式必須是程式設計師所了解的,關於記憶體對齊方式的優點和部分知識可以參閱http www.ibm.com developerworks library pa dalign 結構體占用的儲存空間 struct sizeof 概要 結構體所占用的空間只可能是 1,2,4,6,8.結構體的記憶...
關於結構體內存對齊總結
記憶體對齊計算可謂是筆試題的必考題,但是如何按照計算原則算出正確答案一開始也不是很容易的事,所以專門通過例子來複習下關於結構體內存對齊的計算問題。編譯環境為vs2015 對齊原則 原則1 資料成員對齊規則 結構 struct 或聯合 union 的資料成員,第乙個資料成員放在offset為0的地方,...
結構體內存對齊
結構體內存對齊 一 什麼是位元組對齊,為什麼要對齊?現代計算機中記憶體空間都是按照byte劃分的,從理論上講似乎對任何型別的變數的訪問可以從任何位址開始,但實際情況是在訪問特定型別變數的時候經常在特 定的記憶體位址訪問,這就需要各種型別資料按照一定的規則在空間上排列,而不是順序的乙個接乙個的排放,這...