結構體的大小?
看到下面兩個例子,你可能就發現結構體他和我們一般的變數大小是不同的,這裡存在記憶體對其,最小單位問題;
首先我們先明白記憶體對其是什麼鬼,看到下圖相信你就明白什麼是記憶體對齊了,在這塊的話有很多種排列畫法,為什麼我們要選擇下面這種畫法呢?因為我們定義的結構體變數有先後順序,在編譯時,會根據我們的**由上到下去規劃開闢記憶體並且一端對其,這樣更能有效的執行,雖然浪費一些記憶體。那麼一行放幾個位元組就是我們所要說得最小單位,這裡的最小單位是根據我們的程式定的,比如在下圖,就根據int佔
4個位元組去排列,然後在考慮順序的前提下記憶體高校利用,就有了如下的排列方式。一般再沒有指定最小單元是多少的情況下,都是按照如下規則:
由於儲存變數時位址對齊的要求,編譯器在編譯程式時會遵循兩條原則:
一、結構體變數中成員的偏移量必須是成員大小的整數倍(被認為是任何數的整數倍)
二、結構體大小必須是所有成員大小的整數倍。
由於在沒有指定最小單元的情況下記憶體可能會存在很多浪費,我們就引入如下的概念:指定對齊值函式為
#pragma pack (value)時的指定對齊值value
如下是規則和**:
這是乙個問題,有悖我們的規則,那麼這其中有什麼奧秘有待我們解決
結構體大小
含有基本型別的結構體的大小所對應的最終決定因素是結構體內自身成員的分布。成員不同的分布將導致含有相同成員結構體大小的不同,每個成員的對齊都是以緊接著後面的乙個為參考的,如果緊接著的大於對應指定,就以緊接著的為對齊因子,否則將聯絡周圍的具體情況進行對齊,而且對齊因子只有三種型別 1,2,4。對於最後一...
結構體大小
結構體中的成員可以是不同的資料型別,成員按照定義時的順序依次儲存在連續的記憶體空間。和陣列不一樣的是,結構體的大小不是所有成員大小簡單的相加,需要考慮到系統在儲存結構體變數時的位址對齊問題。看下面這樣的乙個結構體 struct stu1 先介紹乙個相關的概念 偏移量。偏移量指的是結構體變數中成員的位...
結構體大小
下面結構體 struct s1 char ch,ptr union short a,b unsigned int c 2,d 1 struct s1 next sizeof struct s1 是 16位元組 這個呢,char ch乙個位元組,char ptr四個位元組,共用體裡面short a,b...