在複習c語言中結構體時,遇到如下問題。
定義結構體:
typedef struct studentstudent;
int main()
試著去計算結構所佔記憶體空間的大小:
在32位作業系統中,int 所佔4個位元組,char佔乙個位元組,那麼結構體中所佔資料位元組不應該是6個位元組大小嗎。
因為在計算機中是按位址進行編碼的,那麼32位計算機在處理機在處理資料時是每四位進行取址運算元據。
所以就牽扯到一次取資料中是否會取到,「存粹的資料」。話不多說以圖為例:
如圖所示:
假設結構體中的資料在記憶體中的位址初始排列順序為:
其中每個小方塊代表乙個位元組,b;
那麼我們可以通過上圖來觀察,如果計算機中是按照這種資料型別來儲存結構體中定義的基本資料型別的話。在32位作業系統中,按照一次被處理機處理4b的話。即:
那麼我們一次取到了char型別中儲存的1b的資料以及int資料型別中的3b的資料,然後處理機會選擇我們選擇我們需要的,例如將1個b char資料保留3個b的int型別資料」摒棄「。那麼」摒棄「後在想取出int型資料後從char型相鄰的下乙個記憶體單元開始繼續取。
通過上面的步奏可知,當我們想要取出int型別的資料時,處理機是經過兩步才取到我們需要的資料。
而取出的char資料型別也不是「存粹的」char型別。那麼有沒有乙個什麼辦法來解決這個問題,使得每次操作只操作一次即可取出我們所需要的資料,從而提高處理機的執行效率。
我們可以按照對應位數的作業系統一次處理的位元組數來進行「記憶體對齊」操作:
以32位計算機為例:
**注意:**如果取出的四位是由不同型別構成,且四位資料所佔記憶體空間又剛好滿足基本資料型別的大小,則不用分開一次就可以處理。例如基本資料型別的兩個short型別。
C語言 結構體位元組對齊問題
方法一 結構體在記憶體中分配一塊連續的記憶體,但結構體內的變數並不一定是連續存放的,這涉及到記憶體對齊。原則1資料成員對齊規則 結構 struct或聯合union 的資料成員,第乙個資料成員放在offset為0的地方,以後每個資料成員儲存的起始位置要從該成員大小的整數倍開始 比如int在32位機為4...
C語言中結構體
struct oursvoid main struct ours o2 01 結構體整體直接賦值的時候,即使字串也可以直接賦值 o1.str o2.str 錯誤,字串不能直接賦值 字串拷貝的方式 sprintf o1.str,02.str strcpy o1.str,o2.str 3.1 第一種情況...
C語言中結構體變數占用空間及位元組對齊問題
結構體到底占多大的空間呢?先看一下下面這道題的輸出結果 1 include2 3 typedef struct test 4test 910 int main void 11 不妨大膽猜想,結構體所佔空間是不是其成員所佔空間的代數和呢?按照這個猜想,該題的答案應該為13,然而事實卻讓人大跌眼鏡,本題...