http://www.xici.net/b700278/d44576087.htm
1.常規
char str1[] = “Hello” ;
char str2[5] = {'H','e','l','l','o'};
char str3[6] = {'H','e','l','l','o','\0'};
char *p1 = "Hello";
char *p2[]={"hello","world"};
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 ){
sizeof ( p ) = 4 (數組在做為函數參數時均化為指針)
}
void Function2( int p[],int num ){
sizeof ( p ) = 4 (數組在做為函數參數時均化為指針)
}
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{
public:
int a;
};
class B{
public:
int a ;
char b;
};
class C{
public:
int a ;
char b;
char c;
};
sizeof(A) = 4 (內含一個int ,所以大小為4)
sizeof(B) = 8 (int為4,char為1,和為5,考慮到對齊,總大小為int的整數倍即8)
sizeof(C) = 8 (同上)
6.函數與虛函數
編譯器為每個有虛函數的類都建立一個虛函數表(其大小不計算在類中),并為這個類安插一個指向虛函數表的指針,即每個有虛函數的類其大小至少為一個指針的大小4
class A{
public:
int a;
void Function();
};
class B{
public:
int a;
virtual void Function();
};
class C:public B{
public:
char b;
};
class D:public B{
public:
virtual void Function2();
};
class E{
public:
static void Function();
};
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{
private:
int a;
};
class B:public A{};
sizof(B) = 4; (內含一個不可用的父類的int)
8.大概就這么多了吧,想到再加吧。虛函數,多重繼承,空類是比較復雜的,大家大概記住知道就行了
weiloujushi補充:
class static_D
{
int static intVar;
static void fun(){}
};
sizeof(static_D) ==1 //靜態數據成員不計入類內