C++ sizeof 和strlen

最近经常被问道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分配的内存计算在内。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章