sizeof與類的大小

2021-07-09 16:06:55 字數 2199 閱讀 7979

1.當類中沒有虛函式也沒有成員變數的時候,這個類是乙個空類,但是sizeof空類物件的大小,並不是為0,而是為1,即預設空類是有乙個佔位符的。例如:class a{}; sizeof(a) = 1;

注意:sizeof是操作符而不是函式,作用是判斷資料型別或著表示式長度,位元組數的計算在程式的編譯時進行,而不是在程式執行的過程中才計算出來。

2.當類中只含有靜態成員變數,如class a; sizeof(a)=1,這是因為靜態成員變數是分配在全域性儲存區的,所以a類相當於空類,只有乙個佔位符的大小;

3.class a}; sizeof(a)=4;任何含有虛函式的類都有乙個虛函式表指標vptr,用來指向虛函式表因此大小為4;

4.class a; sizeof(a)=8;高位對齊

5.class c:virtual public a;sizeof(c)=4;對於虛擬繼承的類擁有虛函式表,所以空類c含有虛函式表指標vptr;

6.如果累作為派生類,它有多少個父類,每個父類的大小加起來再加上自身就是sizeof的值得大小;

7.需要說明的是:

(1)類本身是不占用記憶體的,但是類本身是有大小的,只有類的例項才能佔記憶體。類的元素氛圍兩種:類的成員變數(儲存在棧區或堆區),類的函式(儲存在**區)。所有的函式都是存放在**區的,不管是全域性函式還是成員函式,靜態成員函式也是儲存在**區的,它與普通成員函式的區別是:引數中第乙個位置沒有this指標,因此不能訪問非靜態成員變數

(2)sizeof不能求得動態分配(使用new 或者malloc分配的)的記憶體的大小,只能測出靜態陣列的長度,如下:

int * a = new int[10]; sizeof(a) = 4;

void * p = malloc(10); sizeof(p)=4;

(3)void fun(int arr[10]) n=4 原因分析如下:

這裡在函式引數傳遞時,陣列被轉化成指標了。因為直接傳遞整個陣列的話,那麼必然涉及到陣列元素的拷貝(實參到形參的拷貝)當陣列非常大時,這會導致效率極低,因而只傳遞陣列的位址,那麼只需要拷貝4byte的資料了,效率就高很多了。

(4)sizeof與strlen的區別:

strlen(char*)函式求的是字串的實際長度,它求的方法是從開始遇到第乙個『\0』,如果只定義沒有給它賦初值,這個結果是不定的,它從指標指向的首位址一直找下去,直到遇到『\0』為止。

example1:

char aa[10];

strlen(aa); //結果將不確定,因為沒有賦初值

sizeof(aa);//結果為10

exemple2:

char aa[10] = ;

strlen(aa);//結果為0;

sizeof(aa)//結果為10

exemple3:

char aa[ ] = "lpr";

strlen(aa

);//結果為3

sizeof(aa);//結果為4

exemple4:

char*aa = "0123456789";

strlen(aa);//結果為10,該字串的長度

sizeof(aa);//結果為4

sizeof(*aa);//結果為1,求得第乙個字元會佔的空間大小

上面大小全是在32位編譯器下得到的大小。

32位編譯器:

char :1個位元組

char*(即指標變數): 4個位元組(32位的定址空間是2^32, 即32個bit,也就是4個位元組。同理64位編譯器)

short int : 2個位元組

int:  4個位元組

unsigned int : 4個位元組

float:  4個位元組

double: 

8個位元組

long: 

4個位元組

long long:  8個位元組

unsigned long:  4個位元組

指標:4個位元組

64位編譯器:

char :1個位元組

char*(即指標變數): 8個位元組

short int : 2個位元組

int:  4個位元組

unsigned int : 4個位元組

float:  4個位元組

double: 

8個位元組

long: 

8個位元組

long long:  8個位元組

unsigned long:  8個位元組

指標:8個位元組

sizeof 類 的大小

什麼是類的例項化,所謂類的例項化就是在記憶體中分配一塊位址 那我們先看看乙個例子 include class a class b class c public a class d public b,public c int main 程式執行的輸出結果為 sizeof a 1 sizeof b 1 ...

sizeof 類的大小

首先,類的大小是什麼?確切的說,類只是乙個型別定義,它是沒有大小可言的。用sizeof運算子對乙個型別名操作,得到的是具有該型別實體的大小。如果 class a a obj 那麼sizeof a sizeof obj 那麼sizeof a 的大小和成員的大小總和是什麼關係呢,很簡單,乙個物件的大小大...

sizeof 類大小,空類大小

乙個類的例項化物件所佔空間的大小?注意不要說類的大小,是類的物件的大小.首先,類的大小是什麼?確切的說,類只是乙個型別定義,它是沒有大小可言的。用sizeof運算子對乙個型別名操作,得到的是具有該型別實體的大小。如果 class a a obj 那麼sizeof a sizeof obj 那麼siz...