結構體所佔空間大小的運算
在C/C++中我們常常會看到有求一個結構體的大小的情況,有時候我們就會想:不就是結構體中各個資料型別所佔的空間加起來就行啦,那麼事實上是不是這樣呢?答案:不是滴。原因是:為了加快讀寫資料的速度,編譯器就實現了資料對其的做法來為每一個結構體分配空間。
這裡我只講結構體中資料對其的一個要點:2倍。
2倍(本人自己總結的)是指有兩個倍數要記住,第一就是結構中的各型別的倍數,第二就是結構體這個型別的倍數。
那麼具體怎麼理解這兩個倍數呢?舉個例子就好理解了。如
struct A { char a; double b; int c; }; (說明:在VS中char佔有1個位元組,double佔了8個位元組,int佔了4個位元組) 計算的時候是這樣子的:首先是按照自上向下為結構體分配空間,並在其之間作調整。首先為char分配一個空間,接著編譯器為了實現資料的對其,所以在分配double的時候會對之前所分配的空間進行一些調整,調整方式是按照原先分配的空間的大小和當前要分配的大小來決定將要分配的空間,因為double為8位元組,所以編譯器要求在double之前所分配的空間大小應該是當期要分配的空間的倍數,在這裡也就是說在double前面分配的應該是8的倍數空間才行,所以原來的char被迫擴充套件到8個位元組,然後才為double分配8個位元組,這樣這兩個變數就佔了16位元組。接著就是到了int了,因為int需要4個位元組,而前面所分配的為16個位元組,是4的倍數,所以接著就為int分配了4個位元組,也就是到了目前編譯器為這個結構體分配了20個位元組,那麼是否就是這個答案呢?哈哈,你試一下就知道這個答案不正確,因為這只是其中的一個倍數(按照我所說的兩個倍數中的一個),那麼還有一個倍數是什麼呢?其實還有一個就是前面所說的對結構體整體的一個倍數處理,已經為結構體分配好20個位元組空間,那麼接下來就是編譯器要求整個結構體所分配的空間大小是結構體中佔用空間最多的型別所佔用空間大小的倍數,如上面的例子,結構體中佔用空間最多的就是double這種了型別,那麼就要求結構體總大小是這個型別的倍數,在這裡也就是要求結構體所佔用空間大小要是8 的倍數,因為20不是8的倍數,所以結構體被迫擴充套件自己的空間,以滿足需要,所以就擴充套件到24個位元組。所以結果為24.不知道你學會了沒有,如果有什麼不同的見解,不如在下面回覆一下,不勝感激。