C C 資料對齊知識摘要

2021-05-22 13:45:07 字數 1458 閱讀 7468

#include

using std::cout;   

using std::endl;   

#include

using std::setw;   

using std::left;   

// 資料對齊   

// 環境: windows 2003 + intel celeron cpu 2.53ghz + vc6.0   

// 資源參考:《linux 核心設計與實現 第二版》isbn:7-111-17865-3/tp.4549   

void sizeofclass();   

void main()   

;  

由於該結構體不能準確地滿足各個成員自然對齊,所以它在記憶體中可不是按照原樣存放  

的。編譯器會在記憶體中建立乙個類似下面的給出的結構體:  

struct bbb;  

填補的變數都是為了讓資料自然對齊而加入的。__pad0 是為了讓 adouble 能夠自然對  

齊而加入的,而其他額外的填補如 __pad1 則是為了讓結構體的長度能夠被最大元素(adouble)  

的長度 8 整除而加入的。結構體aaa的長度為16,而不是13就是因為後一種填補引起的。  

通常你可以通過重新排列結構中的物件來避免填充或減少填充。像結構體aaa那樣,把  

元素按長度的大小遞減/增的排列後就可以使它佔最小的空間了。  

注意:編譯器,優化器並不能改變結構體中元素的排列次序。如ansi c就明確規定不允  

許編譯器改變結構體內成員物件的次序,它總是由你--程式設計師來決定。  

並不是所有的結構體進行這樣的調整的,比如:該結構體作為乙個標準的一部分,或者  

它是現有**的一部分。  

*/  

// 以下是解釋c++中類的記憶體表示機制   

void sizeofclass()   

};   

//雖然son_0沒有宣告成員變數,但是所佔大小仍然為 24 = 16 + 4 +4   

//是因為父類的成員變數都在子類中保留,但是根據許可權   

//描述符而確定是否可以訪問,父類中相應的成員函式也在子類中保留,   

//若有新的實現則指向新的**段,訪問許可權仍有許可權描述符確定。   

class son_0:public father   

};   

/* 雖然son_1public繼承了father的資料成員,但仍然可以再宣告乙個  

public char achar,因為保留的空間位置不一樣。   

*/  

class son_1:public father   

};   

cout << sizeof(father) <<"  "<< sizeof(son_0)<<"  "<< sizeof(son_1)<}  

c c 資料對齊

為了避免混淆,做如下規定,以下 若不加特殊說明都執行於32位平台,結構體的預設對齊值是8,各資料型別所佔位元組數分別為 char佔乙個位元組 int佔四個位元組 double佔八個位元組。請問下面的結構體大小是多少?struct test 複製 這個呢?struct test1 複製 在公布答案之前...

C C 資料對齊

為了避免混淆,做如下規定,以下 若不加特殊說明都執行於32位平台,結構體的預設對齊值是8,各資料型別所佔位元組數分別為 char佔乙個位元組 int佔四個位元組 double佔八個位元組。請問下面的結構體大小是多少?struct test 這個呢?struct test1 在公布答案之前先看一下對齊...

C C 資料對齊

為了避免混淆,做如下規定,以下 若不加特殊說明都執行於32位平台,結構體的預設對齊值是8,各資料型別所佔位元組數分別為 char佔乙個位元組 int佔四個位元組 double佔八個位元組。請問下面的結構體大小是多少?struct test 這個呢?struct test1 在公布答案之前先看一下對齊...