• sizeof()使用技巧


    描述


    sizeof()是C语言的一种单目运算符,它并不是函数。

    1 作用:

             以字节形式给出sizeof操作数的存储大小。操作数可以是一个表达式、基础类型、结构体、类类型等。

    2 特点:

          sizeof 是一个单目运算符,用于计算操作数的存储大小,在编译阶段就已经求值。

    看如下代码

        int a = 0;
    
        int nSize1 = sizeof(a = 3);
    
        cout << nSize1 << endl;
    
        cout << a << endl;


    若不清楚其中的原理,很多人会以为程序输出4和3,其实不然,正确答案是4 和 0.下面分析其原因。


    图1 机器码


    从图1可以看出,sizeof作用于编译阶段特性,在sizeof作用范围内,()内的内容也不能被编译,而是并替换成类型,直接给出操作数大小,这里是int类型,即4个字节。

    其等价代码如下:

    int a = 4;
    int nSize1 = 4;
    cout << nSize1 << endl;
    cout << a << endl;

    sizeof应用技巧


    1)用于数据类型

    格式:sizeof(type) 数据类型必须要用括号括住,如下示例:

    int n = sizeof(int);

    2)用于普通数据类型的变量

    格式:sizeof(var_name) 或者sizeof var_name, 如下示例:

    int a ;
    cout << sizeof(a)<< endl;
    cout << sizeof a <<endl;

    备注: 带括号的更常用


    3)用于指针

    当操作数是指针时,sizeof依赖于编译器, 32位操作系统都是占4个字节,如下示例:

    <pre name="code" class="cpp">    class A
        {
        public:
            A():m_a(0),m_b(0),m_c(0){}
            A(int a, int b, int c):m_a(a),m_b(b),m_c(c){}
            void output()
            {
                cout << m_a << m_b << m_c <<endl;
            }
        private:
            int m_a;
            int m_b;
            int m_c;
        };
        A *pA = new A(1,2,3);
        char szName[20] = "hello world";
        char * ptr = szName;
    
        cout << sizeof(pA) << endl;     //4字节
        cout << sizeof(ptr)<< endl;     //4字节
        cout << sizeof(szName) <<endl;  //20字节


    4)用于数组

    当操作数具有数组类型是,其结果是数组的总字节数,如下示例:

        char szName[20] = "hello world";
        char * ptr = szName;
    
        cout << sizeof(ptr)<< endl;     //4字节
        cout << sizeof(szName) <<endl;  //20字节,数组名代表整个数组

    因此用于初始化数组空间时建议使用sizeof(type) * num.这么做是基于代码更加健壮性的考虑,例如:

         memset(szName, 0, sizeof(char)*20) //健壮性好
        memset(szName, 0, sizeof(szName)) //当szName变量被改成new方式时,sizeof(szName)为4字节

    
    

    5)用于结构体

    在默认情况下,为了方便对结构体内的元素进行访问和管理,结构体类型需要符合4字节对齐。

    struct tagEx1
        {   
            unsigned nAge;       
        };
        struct tagEx2
        {   
            unsigned nAge;
            char ch;
        };
        struct tagEx3
        {   
            char ch;
        };  
        cout << "tagEx1: " << sizeof(tagEx1) << endl;//4个字节
        cout << "tagEx2: " << sizeof(tagEx2) << endl;//8个字节,4字节对齐
        cout << "tagEx3: " << sizeof(tagEx3) << endl;//1个字节

    
    

    6)用于类

     sizeof用于类的用法和用于结构体的是一致的。另外,对类类型我们还可以使用cl命令完成类类型内存大小的查看,具体用法见博文C++对象内存模型分析工具 。

  • 相关阅读:
    使用Dubbox构架分布式服务
    Elasticsearch搜索之explain评分分析
    Elasticsearch搜索之most_fields分析
    Elasticsearch搜索之cross_fields分析
    Elasticsearch搜索之best_fields分析
    Elasticsearch高级搜索排序( 中文+拼音+首字母+简繁转换+特殊符号过滤)
    ibatis2.3中#和$符号的区别(转)
    读文章有感
    图片bmp格式转换为jpg格式
    IndexOf、LastIndexOf、Substring的用法
  • 原文地址:https://www.cnblogs.com/jinxiang1224/p/8468394.html
Copyright © 2020-2023  润新知