#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 在公布答案之前先看一下對齊...