• sizeof


    一、sizeof使用的场合:

    1、sizeof操作符的一个主要用途是与存储分配和I/O系统那样的例程进行通信。例如:

    1 void* malloc(size_t size);
    2 size_t fread(void *ptr, size_t size, size_t nmemb, FILE* stream)

    2、用它可以看看某种类型的对象在内存中所占的单元字节。例如:

    1  void *memset(void *s, int c, sizeof(s));

    3、在动态分配一对象时,可以让系统知道要分配多少内存。

    4、便于一些类型的扩充。在windows中很多结构类型就有一个专用的字段用来存放该类型的字节大小。

    5、由于操作数的字节数在实现时可能出现变化,建议在涉及操作数字节大小时用sizeof代替常量计算。

    6、如果操作数就是函数中的数组形参或函数类型的形参,sizeof给出其指针的大小。

     

    二、sizeof不能使用的场合:

    sizeof操作符不能用于函数类型,不完全类型或位字段。不完全类型指具有未知存储大小的数据类型,如未知存储大小的数组类型、未知内容的结构或联合类型等。

     

    三、

     1 cout<<sizeof(string*)<<endl; // 4
     2 cout<<sizeof(int*)<<endl; // 4
     3 cout<<sizof(char****)<<endl; // 4
     4 
     5 int f();
     6 cout << sizeof(f) << endl;  //编译错误
     7 cout << sizeof(f()) << endl; //4
     8 
     9 int a=6;
    10 cout << sizeof(a=8) << endl;  //输出4,
    11 cout << a << endl; //输出6。sizeof只是个运算符,所以相当于符号替换,a=8被替换成int,并不会修改a的值。

     

    四、

     1 #include <iostream>
     2 using namespace std;
     3 
     4 int Sum(int i[]) {
     5     int sumofi = 0;
     6     for (int j = 0; j < sizeof(i)/sizeof(int); j++)   //实际上,sizeof(i) = 4这里数组名在形参作为指针
     7        sumofi += i[j];
     8     return sumofi;
     9 }
    10 
    11 int main() {
    12     int allAges[6] = {21, 22, 22, 19, 34, 12};
    13     cout<<Sum(allAges)<<endl;
    14      return 0;
    15 }
    View Code
    Sum的本意是用sizeof得到数组的大小,然后求和。但是实际上,传入自函数Sum的,只是一个int 类型的指针,所以sizeof(i)=4,而不是24,所以会产生错误的结果。解决这个问题的方法使是用指针或者引用。
    一般求数组的长度我们会习惯用函数模板。这个可以参考文章《函数模板》。
     
    五、
    1 double* (*a)[3][6]; 
    2 cout<<sizeof(a)<<endl; // 4 a为指针
    3 cout<<sizeof(*a)<<endl; // 72 *a为一个有3*6个指针元素的数组
    4 cout<<sizeof(**a)<<endl; // 24 **a为数组一维的6个指针
    5 cout<<sizeof(***a)<<endl; // 4 ***a为一维的第一个指针
    6 cout<<sizeof(****a)<<endl; // 8 ****a为一个double变量
    View Code
    解析: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。 
     1 #include <iostream>
     2 
     3 using namespace std;
     4 
     5 int main() {
     6    char (*f)[3];
     7    int **c[3][4];
     8    double *(*a)[3][6];
     9    cout << sizeof(f) << endl;   //4
    10    cout << sizeof(*f) << endl;  //3
    11    cout << sizeof(**f) << endl;  //1
    12    cout << sizeof(a) << endl;  //4
    13    cout << sizeof(*a) << endl;  //72
    14    cout << sizeof(**a) << endl;  //24
    15    cout << sizeof(***a) << endl;  //4
    16    cout << sizeof(****a) << endl;  //8
    17    cout << sizeof(c) << endl;    //48
    18     return 0;
    19 }
    View Code
    六、sizeof(class)
    空类的大小为1,其他跟struct差不多,可以参见《字节对齐详解》里面的内容。需要指出的是class里面的virtual函数是独立开来的,virtual代表的是一个虚函数指针,它是一个虚函数表的地址入口。例如:
    1 class classB {
    2     char a;
    3     // double b;
    4     // int c;
    5     virtual func1(){} 
    6 };
    因为虚函数指针占了四个字节,char占了一个字节,安照对齐原则,sizeof(classB)=8, 如果去掉注释int c,那就变成了12. 但,注意如果现在注释int c,而去掉double b的注释,guess what's it? 按一般来说,应该是16,一个double加char和一个指针,补足16位,但实际上是24,因为指针是单独拿出来算了,这就变成了double,加上char补足的八位,加上指针补足的八位,一共是24个字节了。
     

     

  • 相关阅读:
    Windows常用cmd命令总结
    电脑UEFI启动是什么?
    PHP 7天前的时间戳
    背景图片
    SQLite/SQL Server Compact Toolbox
    修改浏览器下拉条颜色和粗细
    thinkphp5 apache htaccess配置文件重写
    thinkphp5 token验证
    英文共享js
    ul高度为0的解决方法
  • 原文地址:https://www.cnblogs.com/lxmhhy/p/3395885.html
Copyright © 2020-2023  润新知