zoukankan      html  css  js  c++  java
  • 转一个比较牛的sizeof分析

    那是很给力啊:

    关于sizeof ,今天出来讨论下,希望感兴趣的童鞋都来一起讨论。
    PS: 由于某些编译器的差异,这里只讨论VC++的情况
    sizeof是C/C++下的运算符,可用于任何变量名、类型名或常量值。
    sizeof有三种语法形式,如下:
        1) sizeof( object ); // sizeof( 对象 );
        2) sizeof( type_name ); // sizeof( 类型 );
        3) sizeof object; // sizeof 对象;
        今天主要讨论指针和数组的使用 具体其他的 可以自己查阅MSDN
    指针变量的sizeof
      指针记录了另一个对象的地址。既然是来存放地址的,等于计算机内部地址总线的宽度。
      所以在32位 计算机中,一个指针变量的返回值必定是4(注意结果是以字节为单位),可以预计,在将来的64位系统中指针变量的sizeof结果为8。
    数组的sizeof
    数组的sizeof值等于数组所占用的内存字节数,也就是数组的长度
    现在看段代码就清楚了
    char str[] = “XXOO”;
    char *p = str ;
    int l = sizeof (str );
    l = sizeof ( p );
    可以分析
    int l = sizeof (str );// sizeof 数组名时是计算数组的长度
    l = sizeof ( p );     // p是个指针,指针在32位机子上长度是4字节的
    在这里就可以发现,其实求得是数组长度 不是数组元素个数
    但是如果我们需要求数组的个数如何求?其实还是蛮简单 MSDN有模型:
    int XX = sizeof( OO ) / sizeof( char ); // 总长度/单个元素的长度
    sizeof()是C++语言自已的运算子。一般而言,关于运算子的行为属于语言本身自已的规定,不存在为什么的问题。也就说C++为sizeof运算子规定的行为就是要对数组名返回其数组所占内存的byte计数,而对其它变量返回应有的类型byte长度,
    比如:
    把”char str[];”改为”long str[4];”则”sizeof(str);”将返回值为16(16个byte)。而对其指向数组str[4]指针,在32位平台上内存地址的byte长度4。
    下面引用一个经典例题:
          double* (*a)[3][6];
          cout<<sizeof(a)<<endl; // 4 a为指针
          cout<<sizeof(*a)<<endl; // 72 *a为一个有3*6个指针元素的数组
          cout<<sizeof(**a)<<endl; // 24 **a为数组一维的6个指针
          cout<<sizeof(***a)<<endl; // 4 ***a为一维的第一个指针
          cout<<sizeof(****a)<<endl; // 8 ****a为一个double变量
    问题解析:a是一个很奇怪的定义,他表示一个指向double*[3][6]类型数组的指针。既然是指针,所以sizeof(a)就是4。
          既然a是执行double*[3][6]类型的指针,*a就表示一个double*[3][6]的多维数组类型,因此 sizeof(*a)=3*6*sizeof(double*)=72。同样的,**a表示一个double*[6]类型的数组,所以 sizeof(**a)=6*sizeof  (double*)=24。***a就表示其中的一个元素,也就是double*了,所以 sizeof(***a)=4。至于****a,就是一个double了,所以sizeof(****a)=sizeof(double)=8。

  • 相关阅读:
    汇编指令记录
    nginx源码剖析(3)nginx中的内存池
    STL中的vector
    Direct3D学习笔记
    委托的作用
    vs2010 快捷键大全
    Web Service学习笔记:什么是Web Service
    [Serializable]在C#中的作用NET 中的对象序列化
    .NET中反射机制的使用与分析
    什么时候用WebService
  • 原文地址:https://www.cnblogs.com/xiangshancuizhu/p/1985570.html
Copyright © 2011-2022 走看看