C C 結構體的儲存分配

2021-05-25 05:19:42 字數 723 閱讀 1865

結構體的大小怎麼計算,在乙個整型佔4個位元組,字元型佔1個位元組的機器裡,乙個包含乙個整型、兩個字元型的結構體型別佔的空間有多大?4+2*1=6?看看下面這段**,你知道它的列印結果(整型4個位元組,字元1個位元組)?

結果會是6、6、6、8嗎?讓我們來看一下結果吧:

你對了多少個?第乙個和第四個相信不會有人錯,第二和第三個有沒有出乎你的意料?包含的元素一樣,卻多佔了三分之一的空間,第四個元素多了,占用的空間卻沒有比第二多,比第三個還少占用了空間。

為什麼會這樣?因為在c和c++裡面,結構體並不是我們想象的那樣緊密地儲存在一起!!它會申請以佔空間最大的那個元素所佔空間數為單位的一段段的空間。如結構體a它會申請兩段長度為4個位元組的儲存空間,而結構體b因為兩個短元素被隔開,會申請3個位元組為4的空間,c的話,因為四個位元組可以裝下4個字元,因而只用申請兩個位元組為四的空間,具體情況如下:

在結構體a、b中,多出來的空間(淺藍色部分)是不會被利用的,會被白白浪費掉。因而在定義結構體的時候,如果不是很特殊(例如兩個元素要放在一起才能更好說明問題),佔空間最大的那個元素通常要放在開頭或末尾,其它的元素經過安排後,能省下不少記憶體空間呃。

哈哈,今晚給我發現新情況了。gcc並不一定是按照佔空間最大的那個元素占有空間來申請一段段空間的,gcc申請的一段空間最大為4,所以對於像double這種8位元組型別,它會給它分配兩段空間。不像vc,vc若有double,申請的空間段至少為8。所以在這兩種編譯器裡面,就算元素一樣,順序一樣,佔的空間也不一樣呃。下面是偶發現新情況的**:

關於結構體的儲存分配

先看乙個例子 struct my t struct my t2 int tmain int argc,tchar argv 結果為 1245020 1245021 1245016 1244996 1245004 1245000 1244980 1244981 1244984812 83個結構體中的成...

結構體的儲存分配問題

struct align 那麼這樣的結構將會花費 個位元組 因為int 型別是占用了 個位元組的,char型別占用 個位元組,所以邊界對齊原則,需要 個位元組 但是我們實際用的是 個位元組的大小,這樣的話我們的儲存利用率是比較低的 所以我們的改進方法就是調整結構宣告的順序就可以了,讓那些對邊界要求最...

C C 結構體儲存問題

64位作業系統,不同型別變數對應的位元組數為 char 1個位元組 char 即指標變數 8個位元組 32位佔4個位元組 short int 2個位元組 int 4個位元組 unsigned int 4個位元組 float 4個位元組 double 8個位元組 long 8個位元組 32位佔4個位元...