• 我也介绍下sizeof与strlen的区别


    本节我也介绍下sizeof与strlen的区别,很简单,就几条:

    1. sizeof是C++中的一个关键字,而strlen是C语言中的一个函数;
    2. sizeof求的是系统分配的内存总量,而strlen通常遇到''时即结束求值计算
    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) << "
    ";   //sizeof(i) == sizeof(int) == 4
    30     
    31     char str1[] = "hello world";
    32     std::cout << sizeof(str1) << "	" << strlen(str1) << "
    "; //12 11, 前者是因为为str1总共分配了12个字节大小内存(加上结束符''),而strlen计算时并不加上结束符
    33 
    34     char str2[100] = "hello world";
    35     std::cout << sizeof(str2) << "	" << strlen(str2) << "
    "; //100 11, 前者是因为给str2显式分配了100字节大小内存,而strlen计算的是实际长度(后面的没有使用)
    36 
    37     char *str3 = "hello world";
    38     std::cout << sizeof(str3) << "	" << strlen(str3) << "
    "; //4 11, 前者是因为str是一个指针,通常一个指针大小是int的大小,即4字节
    39 
    40     A a;
    41     std::cout << sizeof(a) << "	" << sizeof(A) << "
    "; //24 24, sizeof(a) == sizeof(A) == 8+8+8 == 24, 内存对齐
    42 
    43     A *b = new A;
    44     std::cout << sizeof(b) << "	" << sizeof(*b) << "
    "; //4 24, sizeof(b) == sizeof(int) == 4, b是一个指针
    45 
    46     std::cout << sizeof(A) << "	" << sizeof(B) << "
    "; //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

    话说,就是这样。

  • 相关阅读:
    2020年4月13日
    2021年4月12日
    梦断代码阅读笔记02
    Shell基本命令
    远程链接Linux
    Linux文档与目录结构
    VMware与Centos系统安装
    linux 第一天
    day88 Vue基础
    python 生成随机验证码
  • 原文地址:https://www.cnblogs.com/lizhenghn/p/3635466.html
Copyright © 2020-2023  润新知