我也介绍下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

 

话说,就是这样。

posted @ 2014-03-31 12:39  lizhenghn  阅读(1308)  评论(5编辑  收藏  举报
无觅关联推荐,快速提升流量