sizeof与strlen的区别

格式:strlen(字符数组名)
功能:计算字符串S的长度,不包括‘\0'在内
char aa[10]="jun"; cout<<strlen(aa)<<endl; //结果为3
char aa[5]="hello";cout<<strlen(aa)<<endl; //结果为不定值
 
sizeof()返回的是变量声明后所占的内存数,不是实际长度,此外sizeof不是函数,仅仅是一个操作符,strlen是函数。
 
区别:
1.sizeof的结果类型是size_t(也就是unsigned int型),该类型保证能容纳所建立的最大对象的大小。
2.sizeof是操作符(关键字),strlen是函数。
3.sizeof可以用类型做参数,strlen只能用char*做参数,且必须是’\0‘结尾的。
4.数组做sizeof的参数不退化,传递给strlen就退化为指针了。
5.大部分编译程序在编译的时候就把sizeof计算过了是类型或是变量的长度。所以sizeof(x)可以用来定义数组维数,strlen的结果要在运行的时候才能计算出来,是用来计算字符串的长度,不是类型占内存的大小。
6.sizeof后如果是类型必须加括号,如果是变量名可以不用加括号。
PS:对函数使用sizeof,在编译阶段会被函数返回值的类型取代。
 
问:一个空类占多少空间?多重继承的空类呢?
分析: 空类型的实例中不包含任何信息,所以sizeof本来应该为0,但是当声明该类型的实例时,它必须在内存中占用一定空间,否则无法使用这些实例。至于具体占用多少,由编译器决定。Visual Studio中每个空类型的实例占用一字节的空间。因此无论是单一继承,还是多重继承,空类所占空间都为1。
 
:如果在该类型(空类型)中添加一个构造函数和一个析构函数,再对它求sizeof,得到的结果又是多少?
分析:一样为1.因为调用构造函数与析构函数所需的地址只与类型有关,与类型的实例无关,所以实例中不会因为这两个函数添加额外的信息。
 
问:那如果把析构函数标记为虚函数呢?
分析:C++编译器一旦在某个类型中发现有虚函数,就会为该类型生成一个虚函数表,并在该类型的每一个实例中添加指向该虚函数表的指针。因此,在32为系统中,指针占用4字节的内存,所以sizeof的值为4,而在64位系统中则为8.
posted @ 2015-07-07 18:51  Rosanne  阅读(211)  评论(0编辑  收藏  举报