C C 中結構體內存分配問題

2021-04-12 23:17:39 字數 913 閱讀 3173

有人問起當乙個結構體裡面只有乙個char型元素的時候,為什麼這個型別的變數也佔了四個位元組呢.下面我們來看一下:

對於乙個結構體,裡面的元素排列順序不同,那麼分配的空間也會不同. 我們在vc6.0下看如下結構體:

struct test

;當開闢乙個如上結構體型別的空間的時候,系統為它準備的是16個位元組的空間;而當我們試著去改變裡面元素的順序的時候,如下:

struct test

;這個結構體型別的變數所佔的空間就變成了24個位元組.

再考慮下面這個結構體:

struct test1

;當為這個結構體型別的變數分配空間的時候,我們得到的結果是這個變數得到了24個位元組大小的空間.

從上面三個例子,我們可以得出以下結論:

1、結構體變數所分配的空間必定是4或者8的倍數,這是一般前提。這是為了資料對齊,因為我們現在所使用的是基本i386架構的cpu(32位或64位)。而這種架構的cpu是不允許基數記憶體訪問的。

2、但是如果說是4的倍數,那麼上面第二個結構體中三個元素卻佔了24個位元組的空間呢。而第三個結構有4個變數也只佔了24個位元組的空間呢。這是由裡面的資料型別所決定的。在上面第二個結構全中,第乙個元素是乙個char(佔乙個位元組)型,第二個元素是乙個double(佔8個位元組)型,第三個元素是int(佔4個位元組)型。當訪問了乙個char型變數後,系統發現第二個變數是乙個double型,為了資料對齊,當前位址以及當前位址下乙個位址所指向的空間都被迫「捨棄」(不儲存任何資料),這就佔了8個位元組,然後訪問第二個變數,又占去8個位元組;系統又發現第三個變數是乙個int型,同樣,為了資料對齊,又分配了8個位元組,這樣,這個結構體型別的變數就占去了24個位元組。對第三個結構體也可以此類。

由此,我們發現:結構體所佔空間是由其中佔空間最大的元素所決定的。

所以,在設計結構體的時候,元素排列位置的不同常常會影響程式所佔的空間以及執行效率。

C C 中關於結構體內存對齊問題

第乙個成員在與結構體變數偏移量為0的位址處。其他成員要對齊到某個數字 對齊數 的整數倍的位址處。如果設定了記憶體對齊為 i 位元組,類中最大成員對齊位元組數為j,那麼整體對齊位元組n min i,j 結構體總體大小為最大對齊數 每個成員變數都有乙個對齊數 的總數倍。如果巢狀了結構體,巢狀的結構體要對...

C語言結構體內存分配問題

首先需要明白結構體內存對齊的好處 提高訪問效率。但是會造成一定的空間浪費。c語言結構體服從以下原則 1.記憶體對齊 1.結構體大小必須是結構體占用最大位元組數成員的整數倍,這樣在處理陣列時可以保證每一項都邊界對齊 2.結構體的每乙個成員起始位址必須是自身型別大小的整數倍 3.位元組對齊取決於編譯器,...

C C 結構體內存對齊

c c 類 結構體內存遵循三個原則 c 中結構跟類幾乎相同,除了預設成員的訪問控制不同。以下結構體的記憶體對齊在類class中也是一樣的。1 結構體變數的首位址能夠被其最寬基本型別成員的大小所整除 2 結構體每個成員相對於結構體首位址的偏移量 offset 都是成員自身大小的整數倍,如有需要編譯器會...