由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'结尾的。