我也介绍下sizeof与strlen的区别
本节我也介绍下sizeof与strlen的区别,很简单,就几条:
1. sizeof是C++中的一个关键字,而strlen是C语言中的一个函数;
2. sizeof求的是系统分配的内存总量,而strlen通常遇到'\0'时即结束求值计算
3. sizeof可以用在任何类、结构体、对象、变量、类型等身上,strlen通常用于求字符串长度;
4. sizeof在计算一个类类型或类对象的的大小时,需要考虑其数据成员的内存布局(编译器可能会保持内存对齐);
5. sizeof是在编译期计算的,而strlen是在运行时计算的, sizeof这个特性使得其在模板编程、元编程中大放异彩;
直接看代码,
1 //来自Boost源码,带安全检查指针删除 2 template<class T> inline void checked_delete(T *x) 3 { 4 typedef char type_must_be_complete[ sizeof(T) ? 1 : -1]; // 如果T不是完整类型,则此句编译错误! 5 (void) sizeof(type_must_be_complete); 6 delete x; 7 } 8 9 class A 10 { 11 private: 12 int num; 13 double score; 14 char ch; 15 }; 16 17 class B 18 { 19 private: 20 char ch; 21 int num; 22 double score; 23 }; 24 25 26 int main() 27 { 28 int i = 1; 29 std::cout << sizeof(i) << "\n"; //sizeof(i) == sizeof(int) == 4 30 31 char str1[] = "hello world"; 32 std::cout << sizeof(str1) << "\t" << strlen(str1) << "\n"; //12 11, 前者是因为为str1总共分配了12个字节大小内存(加上结束符'\0'),而strlen计算时并不加上结束符 33 34 char str2[100] = "hello world"; 35 std::cout << sizeof(str2) << "\t" << strlen(str2) << "\n"; //100 11, 前者是因为给str2显式分配了100字节大小内存,而strlen计算的是实际长度(后面的没有使用) 36 37 char *str3 = "hello world"; 38 std::cout << sizeof(str3) << "\t" << strlen(str3) << "\n"; //4 11, 前者是因为str是一个指针,通常一个指针大小是int的大小,即4字节 39 40 A a; 41 std::cout << sizeof(a) << "\t" << sizeof(A) << "\n"; //24 24, sizeof(a) == sizeof(A) == 8+8+8 == 24, 内存对齐 42 43 A *b = new A; 44 std::cout << sizeof(b) << "\t" << sizeof(*b) << "\n"; //4 24, sizeof(b) == sizeof(int) == 4, b是一个指针 45 46 std::cout << sizeof(A) << "\t" << sizeof(B) << "\n"; //24 16,sizeof(A) == 8+8+8 == 24, sizeof(B) == 1+4+(3)+8 == 16,括号中的3表示为了对齐而剩余的3个字节 47 48 C * c = NULL; 49 //checked_delete(c); //编译失败,因为C是不完整类型,只有声明,没有定义 50 51 system("pause"); 52 return 0; 53 }
输出结果:
1 4 2 12 11 3 100 11 4 4 11 5 24 24 6 4 24 7 24 16
话说,就是这样。