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++对象内存模型分析工具 。

原文地址:https://www.cnblogs.com/jinxiang1224/p/8468394.html