• 你真的了解sizeof 么?


    sizeof并不是C语言和C++语言中的一个函数,而是一个关键字,一个操作符
    它的作用是返回一个对象或者类型名的长度,也就是说这个对象或者类型所占的内存字节数。它的返回值类型为size_t(usinged int),长度的单位是字节。
    1)对基本数据类型运用sizeof操作,得到其占用内存的字节数
    如 

     
    1. int a;   
    2. double d;   
    3. printf("%d",sizeof a);   
    4. printf("%d"sizeof d);   


    它的输出是4 和 8,因为int在内存中占用4个字节,double在内存中占用8个字节。
    2)对指针做sizeof操作,得到的将是存放指针所需的内存大小

     
    1. char c = 'c';   
    2. int a = 10;   
    3. double d = 3.14;   
    4. char *cp = &c;   
    5. int *ap = &a;   
    6. double *dp = &d;   
    7. printf("%d %d %d",sizeof (cp),sizeof (ap),sizeof (dp)); // 4 4 4   
    8. printf("%d %d %d",sizeof (*cp),sizeof (*ap),sizeof (*dp)); // 1 4 8   


    对于32位的及其来说,每个指针的占用的内存大小都是一个字,亦即32位,也就是4字节,所以第一行输出的是4 4 4 ,对于第二行不用多说,对指针解引用,就是输出的实际上是每个变量的sizeof ,1 4 8

    3)对数组做sizeof操作等效于将对其元素类型做sizeof操作的结果乘上数组元素的个数

     
    1. double a[]={2,4,6,8};   
    2. double *p = a;   
    3. printf("%d %d %d",,sizeof (a),sizeof (*p),sizeof (p)); //32 8 4   


    第一个sizeof是输出数组a在内存中的总长度;第二个sizeof实际是输出数组a的第一个元素(p指针指向其第一个元素)2在内存中所占的字节数,因为是double类型,所以输出8;第三个sizeof是输出指针p在内存中所占的字节数,如2)所示,为四个字节。
    4)对结构体做sizeof操作时得到的是整个结构体所占用内存的大小,但是需要注意的是,结构体构造的时候不足4字节的类型在内存中实际占用了4个字节,这就是所谓的内存对齐

     
    1. struct c   
    2.  {   
    3.   char c;   
    4.   int a;   
    5.   double d;   
    6.  }cobing;   
    7. printf("%d",sizeof (cobing)); //16   


    为什么是16而不是13呢?这是因为虽然char是一个字节,但是在结构体定义的内存中它占用了整整32位,也就是4个字节,加4个字节的int,和8个字节的double,就是16个字节。
    对于sizeof始终要记住的就是:它对某个对象或者类型操作,得出的是这个对象或类型在内存中实际占用的字节数,返回的是一个usinged int类型的整数。以上分析均是针对32位的机器。

  • 相关阅读:
    手机网站调试神器之chrome控制台
    改善C#程序的建议2:C#中dynamic的正确用法
    flowplayer视频播放插件[转]
    Python类,特殊方法, __getitem__,__len__, __delitem__
    Python yield 使用浅析
    Openerp负载平衡
    linux sheel重复执行上条命令
    Python 去除列表中重复的元素
    去除Odoo主页中的提示: Your Odoo is not supported.
    Python 正则表达式学习摘要及资料
  • 原文地址:https://www.cnblogs.com/cobbliu/p/2388550.html
Copyright © 2020-2023  润新知