• sizeof与strlen的区别


    格式:strlen(字符数组名)
    功能:计算字符串S的长度,不包括‘'在内
    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*做参数,且必须是’‘结尾的。
    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.
  • 相关阅读:
    JavaScript垃圾回收机制
    clientHeight ,offsetHeight,style.height,scrollHeight有区别与联系
    win10家庭版安装Docker
    jacoco代码覆盖率报告分析
    jenkins build
    NoSuchAlgorithmException
    记一次单元测试问题com.sun.crypto.provider.HmacSHA1 cannot be cast to javax.crypto.MacSpi
    Mockito入门:如何在Spring中Mock部分对象
    H2数据UNIX_TIMESTAMP兼容问题
    java
  • 原文地址:https://www.cnblogs.com/happygirl-zjj/p/4628282.html
Copyright © 2020-2023  润新知