sizeof

作者: c与php | 来源:发表于2016-11-21 16:36 被阅读75次

    1.sizeof是一个运算符,不是函数
    2.sizeof不能求得void类型的长度,即sizeof(void)编译器会报错。void是一个空类型,编译器无法确定void类型变量的储存大小。
    3.sizeof能够求得void类型变量指针的长度
    指针是存放其他变量地址的变量,目前32为计算机的程序段寻址范围是4GB,寻址的最小单元是byte,4GB=2^32Byte,这么多的内存它的地址要是编码,需要32bit,32bit=32/8=4byte,需要4byte就能够储存这些内存的地址,因此对于任何类型的指针变量进行sizeof运算结果是4.
    4.sizeof能够求得静态分配内存


    sizeof.png

    对于数组a[10],sizeof(a)=10*sizeof(int)=40,
    对于字符串数组char ch[]="abc",sizeof(ch)=4,因为字符串数组结尾有' ',代表字符串结束。
    可以利用sizeof(a)/sizeof(a[0])来计算数组包含的元素个数。

    void fun(int array[10])
    {
         int n=sizeof(array);
    }
    

    此时数组array在函数中被当做指针对待,所以int =sizeof(array)等于4.

    sizeof1.png

    5.sizeof不能求得动态分配的内存的大小

    int *a=new int[10];
    int n=sizeof(a);
    

    此时a的值不能确定。
    6.sizeof不能对不完整的数组求长度。
    假设有sizoef4.cpp文件和sizeof44.cpp文件,在sizeof44.cpp文件中定义

    int arrayA[10]={1,2,3,4,5,6,7,8,9,10};
    int arrayB[10]={11,12,13,14,15,16,17,18,19,20}
    

    创建sizeof44.h文件,将arrayA和arrayB声明为全局变量

    extern int arrayA[];
    extern int arrayB[10];
    

    sizeof4.cpp中这样写

    #include <iostream>
    #include "sizeof44.h"
    using namespace std;
    int main()
    {
          arrayA[];
          arrayB[10];
    
          cout<<sizeof(arrayA)<<endl;//程序会报错
          cout<<sizeof(arrayB)<<endl;
    }
    
    sizeof4.png
    sizeof4.cpp:10:21: error: invalid application of 'sizeof' to incomplete type 'int []' 的意思是sizeof不知道占了多少内存。
    运行上述程序,cout<<sizeof(arrayA)<<endl会报错,屏蔽掉这句程序的到结果40,是arrayB的大小。 sizeof5.png

    7.sizeof求表达式的大小时,返回值是计算结果的大小

    char ch=1;
    int num=1;
    int n1=sizeof(ch+num);
    int n2=sizeof(ch=ch+num);
    

    结果n1=4,n2=1,ch+num计算的结果类型是int, ch=ch+num的结果类型是char,ch+num在计算时结果是int,但是把结果赋给ch时进行的类型转换,表达式的最终类型是char

    sizeof6.png

    8.sizeof可以对函数求大小,求得的大小等于函数返回类型的大小

    int fun(int& num,const int& inc)
    {
         float div=2.0;
         double ret=0;
         num=num+inc;
         ret=num/div;
         return ret;
    }
    

    语句:

    int a=3;
    int b=5;
    cout<<sizeof(fun(a,b))<<endl;
    cout<<a<<endl;
    

    sizeof(fun(a,b))的值是4,sizeof在求函数大小是,得到的是函数返回值类型的大小,fun(a,b)的返回值类型是int,sizeof(int)=4。

    9.sizeof求得的结构体(及其对象)的大小并不等于各个数据成员对象的大小之和.

    struct A{
               int num1;
               int num2;
               double num3;
    };
    
    struct B{
               int num1;
               double num3;
                int num2;
    };
    

    结构体对齐规则:
    (1)结构体的大小等于结构体内最大成员大小的整数倍。
    (2)结构体内成员的首地址相对于结构体首地址的偏移量是其类型大小的整数倍。比如double型成员相对于结构体首地址的地址偏移量应该是8的倍数。
    (3)为了满足(1)(2)的规则编译器会在结构体成员之后进行字节填充。
    sizeof(A)中num1大小是4占0-3位,num2大小为4占4-7位满足(2)规则,num3大小为8占8-15,满足(1)(2),所以sizeof(A)=16.
    sizeof(B)num1大小4占0-3位,num2大小为8,此时num2对于结构体首地址的偏移量是,不满足规则(2),为了满足(2)对num1填充4个字节,占4-7位,num2从8位开始占8-15位,num3大小为4占15-19位不满足规则(1)所以给num3填充19-23,所以结构B的大小最终为24。
    10.:sizeof不能用于求结构体的位域成员的大小,但是可以求得包含位域成员的结构体的大小

    相关文章

      网友评论

          本文标题:sizeof

          本文链接:https://www.haomeiwen.com/subject/ytqupttx.html