• sizeof与strlen的区别


    1、sizeof使用如下:

    #include <iostream>
    #include <cstdio>
    #include <stdio.h>
    #include <string.h>
    using namespace std;
    
    struct{
      short a1;
      short a2;
      short a3;
    }A;//结构体对齐参数默认8字节,3个short类型,对齐字数2字节,总共为6
    
    struct{
      long a1;
      short a2;
    }B;//结构体对齐参数默认8字节,1个long8字节,1个short2字节,补齐16字节(64位操作系统)
       //结构体对齐参数默认8字节,1个long4字节,1个short2字节,补齐8字节(32位操作系统)
    
    int main()
    {
        char *ss1="0123456789";//ss1是一个指针,大小为定值4(32位操作系统)8(64位操作系统)
        char ss2[]="0123456789";//char 1位,总共10位,加上结束符'',共11
        char ss3[100]="0123456789";//预分配100位,字符1位,共100
    
        int ss4[100];//预分配100位,int类型4位,共400
        char q1[]="abc";//同上ss2,共4
        char q2[]="a
    ";//'
    '1位,共3
        char *q3="a
    ";//q3是一个指针,大小为定值4(32位操作系统)8(64位操作系统)
    
        char *str1=(char *)malloc(100);//str1是一个指针,大小为定值4(32位操作系统)8(64位操作系统)
        void *str2=(void *)malloc(100);//str2是一个指针,大小为定值4(32位操作系统)8(64位操作系统)
    
        cout<<sizeof(ss1)<<" ";
        cout<<sizeof(ss2)<<" ";
        cout<<sizeof(ss3)<<" ";
        cout<<sizeof(ss4)<<" ";
        cout<<sizeof(q1)<<" ";
        cout<<sizeof(q2)<<" ";
        cout<<sizeof(q3)<<" ";
        cout<<sizeof(A)<<" ";
        cout<<sizeof(B)<<" ";
        cout<<sizeof(str1)<<" ";
        cout<<sizeof(str2)<<" "<<endl;
        return 0;
    }
    
    
    
    
    #include <iostream>
    #include <cstdio>
    #include <stdio.h>
    #include <string.h>
    using namespace std;
    
    class A{};//空类,默认1个字节
    class B{char d,e;};//两个char类型,2个字节
    struct C{};//空结构体,默认1个字节
    struct D{char b,c;};//两个char类型,2个字节
    struct E{int x,y;};//两个int类型,8个字节
    
    class F{F();~F();};//空类,1字节
    class G{//sizeof计算栈中分配大小,是不会计算静态变量的全局数据区域,所以4+1字节,对齐8字节
        G();
        ~G();
        struct{int a;char c;};
    public:
        static int b;//不计算
    };
    class H{//同上4+1+4+4,对齐16字节
        H();
        ~H();
        struct{int a;char c;};
    public:
        static int b;//不计算
        int e;
    private:
        int f;
    };
    int main()
    {
    
        cout<<sizeof(A)<<" ";
        cout<<sizeof(B)<<" ";
        cout<<sizeof(C)<<" ";
        cout<<sizeof(D)<<" ";
        cout<<sizeof(E)<<" ";
        A *p1=new A();//p1是一个指针,大小为定值4(32位操作系统)8(64位操作系统)
        A p2;//p2属于A的对象等同于A的大小,1字节
        A *p3;//p1是一个指针,大小为定值4(32位操作系统)8(64位操作系统)
        B *p11=new B();//p1是一个指针,大小为定值4(32位操作系统)8(64位操作系统)
        B p22;////p2属于A的对象等同于A的大小,2字节
        B *p33;//p1是一个指针,大小为定值4(32位操作系统)8(64位操作系统)
        cout<<sizeof(p1)<<" ";
        cout<<sizeof(p2)<<" ";
        cout<<sizeof(p3)<<" ";
        cout<<sizeof(p11)<<" ";
        cout<<sizeof(p22)<<" ";
        cout<<sizeof(p33)<<" "<<endl;
        cout<<sizeof(F)<< " ";
        cout<<sizeof(G)<< " ";
        cout<<sizeof(H)<< " ";
        return 0;
    }
    
    
    
    
    #include <iostream>
    #pragma pack(1)//1强制1个字节排列,2强制2个字节排列,下面输出6字节
    using namespace std;
    
    struct A{
        int a=1;
        char b='a';
    };
    
    int main()
    {
        cout << sizeof(A) << endl;//强制1个字节排列,不对其,也就是说5个字节
        return 0;
    }

    2、sizeof使用场合
    (1)、sizeof操作符的一个主要用途是与存储分配和I/O系统那样的例程通信。例如:

    void *malloc(size_t __size);
    size_t fread(void *p,size_t __size,size_t n,FILE *s);

    (2)、用它可以看看某种类型对象在内存中所占的单元字节。例如:

    void *memset(void *s,int c,sizeof(s))

    (3)、在动态分配一对象时,可以让系统知道要分配多少内存。
    (4)、便于一些类型的扩充。在windows中有很多结构类型就有一个专用的字段用来存放该字节大小。
    (5)、由于操作数的字节数在现实时可能出现变化,建议在涉及到操作数字节时用sizeof代替常亮计算。
    (6)、如果操作数是函数中的数组形参数或函数类型的参数,sizeof给出其指针的大小。

    3、sizeof与strlen两者的区别如下:

    (1)、siezof操作符的结果类型是size_t,它在头文件typedef为unsigned int类型。该类型保证能容纳所建立的最大对象的字节大小。
    (2)、sizeof是算符,strlen是函数。
    (3)、siezof可以用类型做参数,strlen只能用char*做参数,且必须是一""结尾的。sizeof还可以作为函数的参数,比如:

    short f();
    cout<<sizeof(f())<<endl;输出为2

    (4)、数组做sizeof的参数不退化,传递给strlen就退化为指针。
    (5)、大部分编程程序的时候就把sizeof计算过来,是类型或者变量的长度。这就是sizeof(x)可以用来定义数组唯独的原因:

    char str[20]="0123456789";
    int a=strlen(str);//a=10
    int b=sizeof(str);//b=20

    (6)、strlen的结果要在运行之后才能计算出来,用来计算字符串的长度,而不是类型占内存的大小。
    (7)、sizeof后如果是类型必须加括号,如果是变量名可以不加括号。这是因为sizeof是个操作符而不是个函数。

    cout<<sizeof 1<<endl;

    (8)、当使用了一个结构体类型或变量是,sizeof返回实际的大小。当使用静态空间的数组时,sizeof返回全部数组的尺寸。sizeof操作符不能返回被动态分配的数组或外部的数组的尺寸。

    struct x
    {
    static double s;//sizeof计算栈中分配大小,是不会计算静态变量的全局数据区域
    int *p = (int*)malloc(100 *sizeof(int));//动态分配数组,计算指针长度,8字节
    int *p1=new int[100];//动态分配数组,计算指针长度8字节
    };

    (9)、数组作为参数传给指针的是指正而不是数组,传递的是数组的首地址,如:f(char[8])、f(char[])都等价于f(char*)。在c++里传递数组永远都是传递指向数组首元素的指针,编译器不知道数组的大小。如果想在函数内知道数组的大小,需要这样做:
    进入函数后用memcpy将数组拷贝出来,长度由另一个形态传进去。代码如下:

    fun(unsiged char *p1,int len)
    {
    unsigned char* buf=new unsigned char(len+1);
    memcpy (buf,p1,len);
    }

    (10)、C++在处理数据时经常把结构变量中的成员的大小按照4或8的倍数计算,这叫数据对齐,这样可能会浪费内存,但在理论上CPU速度快乐。设置#pragma pack(n)的设定可改变对齐规则。
    (11)、sizeof操作符不能用于函数类型、不完全类型或位字段。不完全类型指具有未知存储大小数据的类型数据,如未知存储大小的数组类型,未知内容的结构或联合类型、void 类型等。

  • 相关阅读:
    window安装swagger editor
    DiffMerge安装配置使用
    线程池相关知识点
    JAVA程序员面试笔试宝典4
    JAVA程序员面试笔试宝典3
    JAVA程序员面试笔试宝典2
    JAVA程序员面试笔试宝典1
    Linux开启ssh服务
    面试题
    java基础学习之垃圾回收机制
  • 原文地址:https://www.cnblogs.com/ybf-yyj/p/9204399.html
Copyright © 2020-2023  润新知