程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> C++中數據對齊問題。struct、union、enum。再談sizeof()

C++中數據對齊問題。struct、union、enum。再談sizeof()

編輯:C++入門知識

首先是struct,在C++中,結構體其實和class有很大的相似了。但是有一點不同的是,struct默認是public,而class中是private.         當然,struct繼承等用法也是可以的。         共用體的聲明方式是:            枚舉的聲明方式與共用體比較相似       其中a初始化為0,後面默認增1,若已經初始化,則後面再增1,比如d=6在這裡。   struct長度計算       大家猜一下,s1 x;int b=sizeof(x);   他的結果會是多少呢?有人會覺得應該是1+8+4+1=14.       實際上是24.為什麼會是這樣呢?這個和結構體的對齊方式有很大關系。總之有兩條   1、整體空間是最大成員占用字節的整數倍,比如這裡最大字節占用的是double,他為8,那肯定是8,16,24...   2、內存按照結構體中的數據成員先後排序,並且當前地址應該是以當前成員所占用空間的整數倍。比如在這裡double b占用的是8個字節,那麼以擺字節就應該是8,16,24.而char a,只有一個字節,則前面空間自動補齊。   按照上面兩點的規則,我們不難得出8+8+4+1,但是應該是8的整數倍,所以是24.        這裡有必要補充一下:在Linux+gcc環境下,若最大成員是4,則整體空間只需是4的倍數即可。所以這裡只需要是4的倍數,4,8,12,16,20,24.. 第二點,在Linux+gcc環境下,若某成員類型所占字節數超過4,那前面已擺放空間只需要是4的倍數即可。這裡double b;前面只需補齊4個即可,而不需補齊8個。 故會出現整體空間是20的情況。4+8+4+1=17.但是應該是4的倍數,則為20.            那麼聯合體應該是怎麼樣的呢?        很顯然聯合體取值的時候只能取其中的一個,那麼,聯合體就是多個成員公用一個內存空間。大家很自然的就想到了,最大那個成員所占用的空間就是聯合體的空間了。           講到了數據的對齊方式,那我們就非常有必要講一下兩種不同機器的存儲方式:大端存儲模式和小端存儲模式。         大端存儲模式:高位字節存儲低地位內存中,低位字節存儲高位。這裡均以0x12345678為例。             小端存儲模式:低位存儲在高位內存中       在小端系統中,b的ASCII為多少?   復制代碼  1 union enumName {  2     int i;  3     unsigned char ch[2];  4 };  5 int _tmain(int argc, _TCHAR* argv[])  6 {  7     enumName student;  8        student.i=0x1420;  9     char b=student.ch[0]; 10 } 復制代碼 答案應該是32   小端是低位放低位,高位放高位。則是20   14這樣排放。ch[0]等於0x20.

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved