關於結構體,記憶體對齊,sizeof

2021-05-22 01:07:28 字數 782 閱讀 8441

程式設計師寶典中,關於結構體對齊問題,看了一晚上帖子,包括記憶體,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劃分的,從理論上講似乎對任何型別的變數的訪問可以從任何位址開始,但實際情況是在訪問特定型別變數的時候經常在特 定的記憶體位址訪問,這就需要各種型別資料按照一定的規則在空間上排列,而不是順序的乙個接乙個的排放,這...