以下内容参考自《程序员面试宝典》
sizeof与strlen的区别
1. sizeof操作符的结果类型是size_t,它在头文件中typedef为unsigned int类型。该类型保证能容纳实现所建立的最大对象的字节大小。
2. sizeof是运算符;strlen是函数。
3. sizeof可以用类型做参数,strlen只能用char**做参数,且必须是以'\0'结尾的。sizeof还可以用函数做参数,例如:
short f();
printf("%d\n", sizeof(f()));
输出结果为2,即sizeof(short)。
4. 数组做sizeof的参数不退化,传递给strlen就退化为指针。
5. 大部分编译程序在编译时就已经计算了sizeof,是类型或者是变量的长度,这就是sizeof(x)可以用来定义数组维数的原因;strlen的结果要在运行时才能计算出来,返回字符串的长度(不包括'\0'),而不是类型所占内存的大小。
char str[20] = "0123456789";
int a = strlen(str); // a = 10
int b = sizeof(str); // b = 20
6. sizeof后如果是类型必须加括号,如果是变量名可以不加括号,因为sizeof是操作符而不是函数。
7. 当使用了一个结构类型或变量时,sizeof返回实际的大小。当使用了一个静态的空间数组时,sizeof返回全部数组的尺寸。sizeof操作符不能返回动态分配内存的数组或外部数组的尺寸。
cout << sizeof(bool) << endl; // 1
cout << sizeof(char) << endl; // 1
cout << sizeof(short) << endl; // 2
cout << sizeof(int) << endl; // 4
cout << sizeof(unsigned int) << endl; // 4
cout << sizeof(size_t) << endl; // 8
cout << sizeof(long) << endl; // 4
cout << sizeof(float) << endl; // 4
cout << sizeof(double) << endl; // 8
cout << sizeof(string) << endl; // 32
8. 数组作为参数传给函数时传递的是指向数组首地址的指针而不是数组,在函数中使用sizeof得到的是指针的大小而不是数组的大小。如果想在函数内得到数组的大小,需要将长度作为参数传进去。
char a[10];
cout << sizeof(a) << endl; // 10
char *b = a;
cout << sizeof(b) << endl; // 8
9. 计算结构变量的大小必须讨论数据对齐的问题。为了加快CPU存取速度,C++在处理数据时经常把结构变量中的成员的大小按照4或8的倍数计算,这就叫做数据对齐(data alignment)。MS VC++中的对齐设定,有时候sizeof得到的与实际不等。一般在VC++中加上#pragma pack(n)的设定即可。或者如果要按字节存储,而不进行数据对齐,可以在Options对话框中修改Advanced Compiler选项卡中的“Data Alignment”为按字节对齐。
struct s{
char a;
int b;
};
cout << sizeof(s) << endl; // 8
10. sizeof操作符不能用于函数类型、不完全类型或位字段。不完全类型指具有未知存储大小数据的数据类型,如未知存储大小的数组类型、未知内容的结构或联合类型、void类型等。