關於sizeof的 挺全面的

2021-09-30 09:01:04 字數 2264 閱讀 3983

1.常規

char str1 = 「hello」 ;

char str2[5] = ;

char str3[6] = ;

char   *p1 = "hello";

char *p2=; 

int     n = 10;

int    *q = &n;

sizeof (str1 ) = 6    (自動加了'/0')  

strlen (str1 ) = 5    (字串的長度)  

sizeof (str2 ) = 5     (字元陣列的大小)

strlen (str2) = 未知 (該字串缺少結束符'/0')

sizeof (str3) = 6     (字元陣列的大小)

strlen (str3) = 5    (該字串的長度為5)

sizeof ( p1 ) =   4    (p1是乙個指標,大小為4)

sizeof ( p2 ) =   8    (p2是長度為2的字串陣列)

sizeof ( n ) =   4    (整型大小為4)

sizeof ( q ) =   4    (q是乙個指標,大小為4)

2.動態分配記憶體

int *p = (int *)malloc( 100 );

sizeof ( p ) = 4      (p是乙個指標,大小為4)

3.函式引數

void function1( char p,int num )

void function2( int p,int num )

4.多重繼承

class a{};

class b{};

class c:public a,public b{};

class d:virtual public a{};

class e:virtual public a,virtual public b{};

sizeof ( a ) = 1      (空類大小為1,編譯器安插乙個char給空類,用來標記它的每乙個物件)

sizeof ( b ) = 1      (空類大小為1,編譯器安插乙個char給空類,用來標記它的每乙個物件)

sizeof ( c ) = 1      (繼承或多重繼承後空類大小還是1)

sizeof ( d ) = 4      (虛繼承時編譯器為該類安插乙個指向父類的指標,指標大小為4)

sizeof ( e ) = 8      (指向父類a的指標與父類b的指標,加起來大小為8)

5.資料對齊

類(或結構)的大小必需為類中最大資料型別的整數倍.cpu訪問對齊的資料的效率是最高的,因此通常編譯浪費一些空間來使得我們的資料是對齊的

class a;

class b;

class c;

sizeof(a) = 4 (內含乙個int ,所以大小為4)

sizeof(b) = 8    (int為4,char為1,和為5,考慮到對齊,總大小為int的整數倍即8)  

sizeof(c) = 8   (同上)

6.函式與虛函式

編譯器為每個有虛函式的類都建立乙個虛函式表(其大小不計算在類中),並為這個類安插乙個指向虛函式表的指標,即每個有虛函式的類其大小至少為乙個指標的大小4

class a;

class b;

class c:public b;

class d:public b;

class e;

sizeof (a) = 4   (內含乙個int,普通函式不佔大小)

sizeof (b) = 8   (乙個int ,乙個虛函式表指標)

sizeof (c) =12   (乙個int ,乙個虛函式表指標,乙個char ,再加上資料對齊)

sizeof (d) = 8   (乙個int ,乙個虛函式表指標,多個虛函式是放在乙個表裡的,所以虛函式表指標只要乙個就行了)

sizeof (e) = 1   (static 函式不佔大小,空類大小為1)

7.父類的私有資料

雖然在子類中不可用,但是是可見的,因此私有的資料還是要佔子類的大小

class a;

class b:public a{};

sizof(b) = 4;    (內含乙個不可用的父類的int)

8.大概就這麼多了吧,想到再加吧。虛函式,多重繼承,空類是比較複雜的,大家大概記住知道就行了

weiloujushi補充:

class static_d

};sizeof(static_d) ==1 //靜態資料成員不計入類內

轉 關於Log4j比較全面的配置

log4j的配置之簡單使它遍及於越來越多的應用中了 log4j配置檔案實現了輸出到控制台 檔案 回滾檔案 傳送日誌郵件 輸出到資料庫日誌表 自定義標籤等全套功能。擇其一二使用就夠用了,1 配置根logger level 日誌的級別,指定這條日誌資訊的重要性。分為all debug info warn...

關於c 中的sizeof

再舉個例子 include iostream using namespace std int main 為什麼a結果不是2呢?sizeof本身是c c 的乙個關鍵字 和int char一樣 而不是乙個函式,這注定它是在編譯期所執行的,而在編譯期a b是不會被執行的 同時sizeof的作用是求某個型別...

關於c 中的sizeof

再舉個例子 include iostream using namespace std int main 為什麼a結果不是2呢?sizeof本身是c c 的乙個關鍵字 和int char一樣 而不是乙個函式,這注定它是在編譯期所執行的,而在編譯期a b是不會被執行的 同時sizeof的作用是求某個型別...