最近经常被问道sizeof和strlen的区别,所以现在来总结一下:
1、sizeof是运算符,而strlen是函数。运算符是内置于语言的,函数是所带的库里面的。当然是前者的效率要高一些,不存在函数调用。本质上,运算符应该也算是函数,从运算符重载中可以看出来。
2、sizeof操作符的结果类型是size_t,他在头文件的typedef为unsigned int类型,该类型保证能容纳实现所建立的最大对象的字节大小。
3、sizeof可以用类型做参数,strlen只能用char*做参数,且必须是以“\0”结尾的,sizeof还可以用函数做参数,此时,以函数的返回类型作为sizeof的实际参数。
4、数组做sizeof的参数时不退化,传递给strlen时就退化为指针。
5、大部分编译程序在编译的时候把sizeof计算过了,是类型或是变量的长度,这就是sizeof(x)可以用来定义数组维数的原因。而strlen的结果要在运行时才能计算出来,用来计算字符串的长度,而不是类型占内存的大小。
例如:如下代码能正常通过编译:
<span style="font-size:18px;">char arrays[sizeof(array)];
cout << sizeof(arrays) << endl;</span>
输出结果如下:
而如下的写法将不同能通过编译:
<span style="font-size:18px;">char arrays[strlen(array)];</span>
编译器将提示:表达式必须含有常量值。
6、sizeof后如果是类型必须加括号,如果是变量名可以不加括号,这是因为sizeof是操作符而不是函数。
如下代码将可以通过编译:
<span style="font-size:18px;">int b = 0;
cout << sizeof b << endl;</span>
执行结果如下:
而
<span style="font-size:18px;">cout << strlen array << endl;</span>
将提示编译错误。7、当使用了结构类型或者变量时,sizeof返回实际的大小,当使用一静态的空间数组时,sizeof返回全部数组的大小,sizeof操作符不能返回被动态分配的数组或外部的数组的尺寸。如下代码的返回结果是4,即将数组作为指针处理。
<span style="font-size:18px;">int * array = new int[100];
cout << sizeof(array) << endl;</span>
8、sizeof操作符不能用于函数类型、不完全类型、或位字段。不完全类型指具有未知存储大小的数据类型,未知存储大小的数组类型、未知内容的结构或者联合类型。
9、sizeof(表达式),表达式中的内容不会被执行。如
<span style="font-size:18px;">int b = 0;
cout << sizeof(b = 7) << endl;
cout << b << endl;</span>
上边的语句执行完之后,b的值仍然是0,结果如下图。
10、sizeof计算栈中分配的大小,不计算全局数据区中分配的大小。(2015/08/30补充)
定义如下的一个结构体Mystruct和MyClass;
struct MyStruct
{
static int a;
double b;
};
class MyClass
{
public:
MyClass();
~MyClass();
public:
int a;
static int b;
private:
};
使用sizeof的输出结果如图:
由上图可知,sizeof在计算是并没有将static分配的内存计算在内。