每個字段都要放到內(nèi)存地址編號(地址值) 自身的整數(shù)倍地址上去滔悉。
(這樣理解也可以厅瞎。 不用太糾結(jié)??厕隧,就可以不用看下面的)企量。
為什么存在內(nèi)存對齊
平臺移植型好
不是所有的硬件平臺都能訪問任意地址上的數(shù)據(jù)涵防;某些硬件平臺只能只在某些地址訪問某些特定類型的數(shù)據(jù)闹伪,否則拋出硬件異常,及遇到未對齊的邊界直接就不進行讀取數(shù)據(jù)了壮池。
cpu處理效率高
從上圖可以看出偏瓤,對應(yīng)兩種存儲方式,若CPU的讀取粒度為4字節(jié)椰憋,
那么對于一個int 類型厅克,若是按照內(nèi)存對齊來存儲,處理器只需要訪存一次就可以讀取完4個字節(jié)
若沒有按照內(nèi)存對其來讀取橙依,如上圖所示证舟,就需要訪問內(nèi)存兩次才能讀取出一個完整的int 類型變量
具體過程為,第一次拿出 4個字節(jié)票编,丟棄掉第一個字節(jié)褪储,第二次拿出4個字節(jié),丟棄最后的三個字節(jié)慧域,然后拼湊出一個完整的 int 類型的數(shù)據(jù)鲤竹。
32位 與 64位 程序 對齊 有區(qū)別。 一個默認是4字節(jié) 一個是8字節(jié)。
char 一個字節(jié)的辛藻,隨便放碘橘。 大于1個字節(jié)的時候,需要注意對齊粒度了吱肌。禁止讓一個多字節(jié)數(shù)據(jù)跨粒度了痘拆。
struct 前面的字段要對后面數(shù)據(jù)的地址編號的負責(zé), 如果大于char了氮墨。 short 必須是2的倍數(shù)纺蛆。 int 是4的倍數(shù) double 是8的倍數(shù)。最后一個字段對下個結(jié)構(gòu)體 開頭位置負責(zé)规揪。(結(jié)構(gòu)體 放到數(shù)組中的時候 需要對齊)
https://blog.csdn.net/weixin_41453492/article/details/101318522
https://acl.readthedocs.io/en/latest/zhCN/ch2-cn.html
https://ksco.gitbooks.io/build-your-own-lisp/content/Basics.html
核心 #pragma pack(8) 這里不指定的話,就是默認值. 用該形式(權(quán)),確定怎么計算每個結(jié)構(gòu)體中的變量具體地址. good (不含糊了.明確了.)
結(jié)構(gòu)體默認對齊
規(guī)則
- 64位操作系統(tǒng)上64位編譯器:默認8字節(jié)對齊
- 64位操作系統(tǒng)上32位編譯器:默認8字節(jié)對齊
- 32位操作系統(tǒng)上32位編譯器:默認4字節(jié)對齊
以下兩點是對于64位操作系統(tǒng)上64位編譯器:默認8字節(jié)對齊而言的桥氏,如果是4字節(jié)對齊,只需要將8改成4即可:
- 結(jié)構(gòu)體整體本身安置在8字節(jié)對齊處猛铅,結(jié)構(gòu)體對齊后的大小必須是8的倍數(shù)
- 結(jié)構(gòu)體中每個元素占的字節(jié)大小是自身對齊參數(shù)的整數(shù)倍