sizeof 是一個操作符(operator),其作用返回一個對象或數據類型所占的內存字節數。
實例
[cpp]
#include "stdafx.h"
#include <stdlib.h>
#include <iostream>
using namespace std;
void* Fun1()
{
printf("void\n");
return NULL;
}
char Fun2()
{
char c='c';
printf("char c='c'");
return c;
}
int Fun3()
{
int i=2;
printf("int i=2");
return i;
}
struct strc0
{
};
struct strc00
{
int getA();
};
struct strc000
{
int* getA()
{
return NULL;
}
};
struct strc1
{
int a;
char b;
};
struct strc2
{
char b;
int a;
};
struct strc3
{
char b;
int a;
double c;
};
struct strc4
{
double c;
char b;
int a;
};
struct strc5
{
char b;
double c;
int a;
};
struct strc6
{
int a;
double c;
char b;
};
struct strc7
{
int a;
double c;
char b;
char d;
};
class classA0
{
};
class classA00
{
int GetA();
char GetB();
};
class classA000
{
int GetA()
{
return 1;
}
char GetB()
{
return 'c';
}
};
class classA1
{
int a;
double b;
};
class classA2
{
char b;
double c;
int a;
};
class classA3
{
char b;
double c;
int a;
char d;
};
int _tmain(int argc, _TCHAR* argv[])
{
//基本數據類型
printf("%d\n",sizeof(char));// 1
printf("%d\n",sizeof(int));// printf("%d\n",sizeof(2)); 4
printf("%d\n",sizeof(double));// printf("%d\n",sizeof(2.12)); 8
printf("%d\n",sizeof(string));// 32
//函數:看其返回值,與內部申請的變量無關,且不調用函數
printf("%d\n",sizeof(Fun1()));// 4 //沒有調用函數
printf("%d\n",sizeof(Fun2()));// 1
printf("%d\n",sizeof(Fun3()));// 4
//指針:占用內存字節數都為4
printf("%d\n",sizeof(void*));//4
printf("%d\n",sizeof(int*));// 4
//數組:其值是(下標*數據類型),當數組為參數時,則淪為了指針
int a1[4];
char a2[]="abcd";//char a2[4]="abcd";//數組界限溢出
char a3[6]="abcd\0";//說明“\0”是一個字符(轉義字符)
char a4[20]="abc";
printf("%d\n",sizeof(a1));// 4*4=16
printf("%d\n",sizeof(a2));// 5,字符末尾還存在一個NULL的結束符
printf("%d\n",sizeof(a3));//6
printf("%d\n",sizeof(a4));//20,說明給a4分配了20個字節的內存空間,不論是否填充滿
printf("%d\n",sizeof(a4[10]));//1,a4[4]是一個char類型的數據
//結構體,涉及到字節對齊的問題,而字節對齊的細節與編譯器實現有關。
//結構體的總大小為結構體最寬基本類型成員大小的整數倍
//結構體每個成員相對於結構體首地址的偏移量(offset)都是成員大小的整數倍
//自己總結的:結構體的大小=最寬基本類型成員大小+其前後丈量的個數。其成員函數不占用內存
printf("%d\n",sizeof(strc0));//1,空的結構體占內存為1
printf("%d\n",sizeof(strc00));//1,在結構體內什麼的函數不占內存
printf("%d\n",sizeof(strc000));//1,在結構體內定義的函數不占內存,不論其返回值是什麼。
printf("%d\n",sizeof(strc1));//8,說明結構體中存在字符對齊的現象
printf("%d\n",sizeof(strc2));//8
printf("%d\n",sizeof(strc3));//不是24,而是16
printf("%d\n",sizeof(strc4));//不是24,而是16
printf("%d\n",sizeof(strc5));//不是16,而是24
printf("%d\n",sizeof(strc6));//不是16,而是24
printf("%d\n",sizeof(strc7));//24
//類:與結構體一樣。類的大小=最寬基本類型成員大小+其前後丈量的個數。且成員函數不占用內存
printf("%d\n",sizeof(classA0));//1
printf("%d\n",sizeof(classA00));//1,說明申明的函數不占內存
printf("%d\n",sizeof(classA000));//1,說明定義的函數不占內存
printf("%d\n",sizeof(classA1));//16,說明類中也存在字符對齊的現象
printf("%d\n",sizeof(classA2));//24
printf("%d\n",sizeof(classA3));//24
system("pause");
return 0;
}
最後總結:
類/結構體的大小=最寬成員類型+其前後丈量的個數。且成員函數不占用內存,不論其是否有返回值。