在32位系統下,gcc的對齊方式為1,2,4,預設為4位元組對齊。
在64為系統下,gcc的對齊方式為1,2,4,8,預設為8位元組對齊。
union變數所占用的記憶體長度等於最長的成員的記憶體長度。
struct和class記憶體中儲存形式一樣(函式不佔記憶體空間)。
當多個資料需要共享記憶體或者多個資料每次只取其一時,可以利用聯合體(union)。在c programming language 一書中對於聯合體是這麼描述的:
1)聯合體是乙個結構;
2)它的所有成員相對於基位址的偏移量都為0;
3)此結構空間要大到足夠容納最"寬"的成員;
4)其對齊方式要適合其中所有的成員;
下面解釋這四條描述:
由於聯合體中的所有成員是共享一段記憶體的,因此每個成員的存放首位址相對於於聯合體變數的基位址的偏移量為0,即所有成員的首位址都是一樣的。為了使得所有成員能夠共享一段記憶體,因此該空間必須足夠容納這些成員中最寬的成員。對於這句「對齊方式要適合其中所有的成員」是指其必須符合所有成員的自身對齊方式。
下面舉例說明:
如聯合體
union u
;
s佔9位元組,n佔4位元組,d佔8位元組,因此其至少需9位元組的空間。然而其實際大小並不是9,用運算子sizeof測試其大小為16.這是因為這裡存在位元組對齊的問題,9既不能被4整除,也不能被8整除。因此補充位元組到16,這樣就符合所有成員的自身對齊了。從這裡可以看出聯合體所佔的空間不僅取決於最寬成員,還跟所有成員有關係,即其大小必須滿足兩個條件:
1)大小足夠容納最寬的成員;
2)大小能被其包含的所有基本資料型別的大小所整除。
1 **
#includeusing namespace std;
union a;
int main()str1;
這裡char佔1個位元組,int佔4個位元組,short佔2個位元組,按單元存放如下圖:ab
bbbc
c
由於a占用了1個位元組,b存不下,所以開闢新的單元存放b,然後再開闢新的單元存放c。
從這裡可以看出結構體在記憶體中是按單元存放的,總占用位元組數就是3*4=12。
例子2:
truct b
str2;
存放如圖:ac
c bbb
b
在這裡由於b占用4個位元組,而a和c總共才占用3個位元組,足夠c存放,所以c存放在a的後面,再開闢新的單元存放b。
此例中占用位元組數為2*4=8。
例子3:
struct c
str3;
存放如圖:ab
bccc
c 這裡由於資料型別都為char型別,故不必再開闢新的單元,一行存完。
占用位元組數為1*1+2*1+4*1=7。
綜上所述,結構體在記憶體中存放是按單元存放的,所開闢單元的最大長度取決於佔位元組最大的資料型別,此外我們可以發現儲存順序對空間的使用率有一定的影響。
從以上三例可以看出,第一種最浪費空間;第三種最節省空間,但全使用相同型別,丟失了字段本生的資料型別,不方便使用;第二種介於第一種和第三種寫法之間,其空間上比較緊湊,同時又保持了結構體中字段的資料型別。大家可以嘗試用sizeof()去深入了解結構體中的按單元存放。
1 **
#includeusing namespace std;
typedef union udate;
struct datatoo;
udate temp;
int main(){
cout<2 執行
[root@localhost charpter01]# g++ 0116.cpp -o 0116
[root@localhost charpter01]# ./0116
6440
24
3 說明
sizeof(temp)=24在以前示例中已經解釋。
我們看看sizeof(struct data)的計算。cat占用4個位元組,cow占用24個位元組。因為cow是8位元組對齊,所以cat後要填充4個位元組,即cat和cow共占用4+4+24=32位元組。
dog佔8位元組,從32位元組開始,已對齊,所以共40個位元組。
String型別占用位元組大小
system.out.println charset.defaultcharset 獲取ide預設編碼型別 string s new string china getbytes byte b s.getbytes system.out.println b.length 以上 可以輸出 china 所...
占用位元組數求法
字串占用位元組數 ansi char szstr abc 占用位元組數求法 sizeof szstr char psz defgh 占用位元組數求法 strlen psz sizeof char unicode wchar t szwstr l abc 占用位元組數求法 sizeof szwstr ...
oracle漢字占用位元組長度
1 今天調查乙個oracle資料庫問題的時候,發現在11g中乙個漢字佔2個位元組,在10g中佔3個位元組,導致將11g資料庫中的資料匯入到10g的時候總是出錯,開始的時候還以為是11g和10g的版本不一樣,漢字占用位元組數不一樣,後來一想,oracle不會這麼幹吧,那樣差別也太大了,後來一調查,發現...