c 位元組對齊

2021-05-22 06:51:22 字數 1423 閱讀 5850

1. 虛函式

如果 classa 有虛函式, 編譯器會給每個 classa 物件新增乙個隱藏成員, 該隱藏成員儲存了乙個指向虛函式表的指標.

所以 sizeof classa 如果比你預想的多了 4 位, 不要驚奇, 因為多了乙個 size(指標).

但是這個隱藏指標是先算還是後算呢?

class a

int a;

char b;

double c;

int d;

virtual void aa(){};

sizeof(a):

先算是 (4 + 4) + (1 補7) + 8 + (4 補4) = 32

後算是 (4 + 1 補3)  + 8 + (4 + 4) = 24

結果是: 32.

結論就是: 隱藏指標最先計算.

2. 如果類中有類成員或有陣列, 那sizeof 是怎麼算的呢?

class b

;sizeof(b) 結果是: 12.      (4) + (4) + (3 +1) = 12

結論就是: 陣列是被分開來算的, 就好比有 7 個char name.

class c

;class d

;sizeof(c) 結果是: 24.(4+4) + (3+1 補4) + 8 = 24還是 12 + 12 = 24呢?

sizeof(d) 結果是: 16.      (4) + (4) + (3+1) + 4 = 16, 上面的結論明顯是前者.

結論就是: 成員變數 b(類b 的物件), 不是被看成乙個整體, 而是把所有的基本型別變數陳列起來, 一起計算.

3.共用體 union

union u

;sizeof(u) 結果是: 8.

結論就是: 共用體是看 最大的成員變數的型別 的.  u中最大的就是double了.

那如果共用體u中某個成員變數的型別是某個類呢?

union u2

;sizeof(u2) 結果是: 16.    

從前面可以知道sizeof(b) 結果是12, 如果是所有的基本型別變數陳列在一起, 那最大的應該是 double, 但結果並不是 8, 而是16. 如果用 8位元組對齊來計算 b 占用的記憶體, (4+4) + (3+1補4) = 16, 跟 sizeof(u2) 的結果一樣. 這也不違背上面已經取得的結論了.

結論就是: 共用體是看 最大的成員變數的型別 的, 不管該型別是基本型別, 類或結構. 如果是類或結構型別, 其位元組對齊是看所有基本型別中最大的.

mysql位元組對齊 C 位元組對齊彙總

一 什麼是位元組對齊 現代計算機中記憶體空間都是按照byte劃分的,從理論上講似乎對任何型別的變數的訪問可以從任何位址開始,但實際情況是在訪問特定型別變數的時候經常在特定的記憶體位址訪問,這就需要各種型別資料按照一定的規則在空間上排列,而不是順序的乙個接乙個的排放,這就是對齊。二 位元組對齊的原因和...

c 位元組對齊

在 c 中位元組對齊主要存在符合型別中 union struct 和class中 先介紹四個概念 1 資料型別自身的對齊值 基本資料型別的自身對齊值,等於sizeof 基本資料型別 2 指定對齊值 pragma pack value 時的指定對齊值value。3 結構體或者類的自身對齊值 其成員中自...

C 位元組對齊

這篇部落格主要介紹c 位元組對齊的方式 什麼是位元組對齊 現代計算機中記憶體空間都是按照 byte 劃分的,從理論上講似乎對任何型別的變數的訪問可以從任何位址開始,但實際情況是在訪問特定型別變數的時候經常在特 定的 記憶體位址 訪問,這就需要各種型別資料按照一定的規則在空間上排列,而不是順序的乙個接...