sizeof()使用技巧

来源:互联网 发布:阿里云邮箱官网下载 编辑:程序博客网 时间:2024/06/15 14:19

描述


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

1 0
原创粉丝点击