详解sizeof

由MSDN知sizeof关键字(操作符)可以返回一个变量或类型在内存中所占有的字节数。

sizeof有两种用法

1)  sizeof(object)

这种用法下,括号可以省略。

2)  sizeof(typename)

这种用法下,括号不可以省略。

int i;

sizeof(i); 在运行期执行,返回i所占内存的大小。

sizeof(int); 在编译期执行,返回int所需内存的大小。

求内置类型的大小
在32位操作系统的计算机上:

sizeof(char)  == 1byte

sizeof(int) ==  4byte

sizeof(float)  ==  4byte

sizeof(double)  ==  8byte

sizeof(short)  ==  2byte

sizeof(long)  ==  4byte

sizeof(long double)  ==  8byte

求类类型的大小

1)不包含任何类型的空类

Class A

{

 

};

A  a;

首先需要明确一点,sizeof是求类型的变量或实例化对象所需要的内存空间,而空类也可以实例化对象,而占用一定的空间,至于占多少空间由编译器决定。在Visual Studio中:

sizeof(A) == 1byte

sizeof(a) == 1byte

2)包含析构函数和构造函数的类

Class A

{

public:

         A();

         ~A();

};

则sizeof(A)  == 1byte

因为构造函数和析构函数只需要知道函数的地址即可,而这些函数的地址只与类型相关,而与类型的实例无关,sizeof是针对实例的,所以仍是1byte。

3)  包含虚函数的类

Class A

{

public:

         A();

         virtual ~A();

};

则sizeof(A)  == 4byte

C++编译器一旦发现一个类型中有虚函数,就会为该类型生成虚函数表,并在该类型的每一个实例中添加一个指向虚函数表的指针。在32位的机器上,一个指针占有4byte的空间。

另外:1.类的大小为类的非静态成员数据的类型大小之和,也就是说静态成员数据不作考虑。

2.普通成员函数与sizeof无关。

求指针的大小

指针的大小是指针变量占用的内存空间,由于指针存储的是另一个变量的地址,而不是变量本身,所以无论是存储什么类型变量的地址,都只需要一个int类型大小的容量,即4byte。

再看下面两个例子

例子一:

char* ss = "0123456789"; 
1、sizeof(ss)的结果是4,ss是指向字符串常量的字符指针 
2、sizeof(*ss)的结果是1,*ss是第一个字符 
 例子二:
char ss[] = "01233456789"; 
1、sizeof(ss)结果是11,ss是数组,计算到'\0'的位置,因此是10+1 
2、sizeof(*ss)结果是1,*ss是第一个字符 

sizeof与strlen的区别

由下面两个例子说明:

例子一:

char ss[100] = "0123456789"; 
1、sizeof(ss)的结果是100,ss表示在内存中预分配的大小:100*1 
2、strlen(ss)的结果是10,它的内部实现是用一个循环计算字符串的长度,直到'\0'为止。 
例子二:

int ss[100] = "0123456789"; 
1、sizeof(ss)的结果是400,ss表示在内存中的大小,为100*4 
2、strlen(ss)错误,strlen的参数只能是char*,且必须是以'\0'结尾的。 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值