在学习sizeof的具体应用实例之前,需要对计算机的一些存储机制和各数据类型的大小有一定的了解。本文将相关知识放在了文章的结尾,主要是数据的对齐问题和数据类型的大小。下面是总结的sizeof的实例应用。
一、单个变量
int a = 0;
unsigned int b = 10;
char c = ‘z’;
char *p = NULL;
求
sizeof(a); //=4,此处即为int型数据的大小,为4字节
sizeof(b); //=4,unsigned影响的只是最高位的意义(正或负),不影响数据长度
sizeof(c); //=1,此处即为char型数据的大小,为1字节
sizeof(p); //=4,指针的大小是一个定值,就是4字节
求解单个变量的sizeof,将括号中的变量替换成该变量的数据类型,即为数据类型的大小,此处需注意unsigned不会影响数据类型的长度
二、数组
int a_1[10] = {1,4,5,7};
int a_2[] = {2,6,7,4,3,1};
char *st_1 = “12345”;
char st_2[] = “123456”;
char st_3[] = “abc\n”;
char *st_4 = (char*)malloc(100);
求
sizeof(a_1); //=40,为数组分配10个整型元素空间,每个元素4个字节,共40字节
sizeof(a_2); //=24,初始化6个整型元素,6*4个字节
sizeof(st_1); //=4,st_1为指针,固定大小为4字节
sizeof(st_2); //=7,字符串尾部有隐含的’\0’,因此共有7个char型元素,7*1个字节
sizeof(st_3); //=5,同样为字符串,\n记作1个字节,共5*1个字节
sizeof(st_4); //=4,st_4为指针,固定大小4个字节
注意:指针的大小,在32位系统下为4,在64位系统下为8,以下涉及到的虚指针同理
三、结构体
此处涉及到数据对齐的知识。在默认情况下,结构体内元素长度都小于处理器位数时,便以结构体内最长的数据元素为对其单位,即结构体的长度一定是最长数据元素的整数倍。
struct{
short a1;
short a2;
short a3;
}A;
struct{
char b1;
long b2;
}B;
求
sizeof(A); //=6,A中元素都为short,长度都为2字节,共3*2字节
sizeof(B); //=8,B中b1为1字节,b2为4字节,以4字节对齐,共2*4字节
四、类
类的长度同样要遵循数据对齐的原则。
class A1
{ }
class A2
{ A2();
~A2(); }
class A3
{ A3();
virtual ~A3();
}
class A4
{public:
bool x;
int y;
bool z;
}
class A5
{public:
int x;
bool y;
bool z;
}
class A6
{public:
int x;
static int y;
}
class B1 : public A1
{ }
class B2: public vitual B1
{ }
求
sizeof(A1); //=1,空类所占空间为1
sizeof(A2); //=1,调用A()与~A()只需要知道函数的地址,不会添加类型数据
sizeof(A3); //=4,析构函数为虚函数,需要添加一个指向虚函数表的指针,指针为4
sizeof(A4); //=12,此处注意与A5的区别,遵循数据对齐的原则
sizeof(A5); //=8
sizeof(A6); //=4,静态变量为全局变量,在全局数据区,不在栈区, sizeof不计算
sizeof(B1); //=1,单一继承与多重继承空类,所占空间都为1
sizeof(B2); //=4,虚继承涉及虚指针
五、自定义类型
自定义类型的sizeof取值就等于他的数据原型,如
typdef short BIT;
sizeof(short) 即sizeof(BIT)
六、函数
函数的sizeof取值会被函数的返回值类型取代,如
int fun();
sizeof(fun()) 即 sizeof(int)
附:
1、各数据类型的大小
sizeof(int) = 4;
sizeof(unsigned int) = 4;
sizeof(short int) = 2;
sizeof(unsigned short) = 2;
sizeof(long int) = 4;
sizeof(unsigned long) = 4;
sizeof(float) = 4;
sizeof(double) = 8;
sizeof(long double) = 12;
2、数据对齐
参考链接:http://www.cnblogs.com/graphics/archive/2010/08/12/1797953.html