結構體的記憶體大小怎麼算

2021-08-20 13:25:28 字數 1150 閱讀 2650

前言:

想通俗的講解一下結構體的記憶體怎麼計算,所以再次寫了一篇這樣的文章,想將這個知識點描述得更加容易理解

正文:

首先我們要知道結構體內存計算與編譯器的預設對齊數有關,一般windows環境預設對齊數為8,linux預設對齊數為4

1.結構體內存對齊的基準取記憶體最大的變數的位元組數與預設對齊數的較小值。

2.結構體的總記憶體必須是記憶體最大的變數的整數倍數。

例:在linux環境下,預設對齊數為4

struct a

;

分析:預設對齊數為4,而結構體中記憶體最大的為int型別,為4個位元組,所以對齊的基準為4,並且結構體的記憶體必須是4的倍數。放下乙個變數a後,使用了乙個位元組,因為基準是4,還剩下三個位元組放不下i了,所以要浪費3個位元組,在浪費的3個位元組後放入i然後放入b,現在總位元組數為1+3+4+1=9,因為總位元組數要為4的倍數所以最終大小為12.3.其他成員變數要對齊到某個陣列(對齊數)的整數倍的位址處

這句話怎麼理解呢

乙個例子哈

struct a

由上面的知識很容易我們知道a記憶體大小為8

但是內部成員怎麼分布呢

不是這樣的

而是這樣的

即其他成員變數要對齊到某個陣列(對齊數)的整數倍的位址處

未完。。。

共用體Union的記憶體大小

下例表示宣告乙個共用體foo union foo int i char c double k 再用已宣告的共用體可定義共用體變數。例如用上面說明的共用體定義乙個名為bar的共用體變數,可寫成 union foo bar 在共用體變數bar中,整型變數i和字元變數c共用同一記憶體位置。當乙個共用體被宣...

C語言中結構體占用記憶體大小

這個問題很經典,很容易出現,也叫記憶體的4k對齊吧 cpu傳輸資料的方式 cpu每次傳輸資料大小由它的總線條數決定,32位傳輸4個位元組,64位傳輸8個位元組。這裡以64位系統舉例,若宣告乙個變數大小為8位元組,起始位址位1,而cpu讀取的位址為0 7,則該變數需要讀取兩次,顯然降低了cpu的效能。...

struct結構體記憶體大小

概括 一.基本原則 1.struct中成員變數的宣告順序,與成員變數對應的記憶體順序是一致的 2.struct本身的起始儲存位址必須是成員變數中最長的資料型別的整倍數,注意是最長的資料型別,而不是最長的變數 對於陣列只看型別不看元素個數 3.記憶體對齊與編譯器設定有關。二.計算規則 以下的所有規則,...