zoukankan      html  css  js  c++  java
  • 你真的了解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位的机器。

  • 相关阅读:
    HDU 2888 Check Corners (模板题)【二维RMQ】
    POJ 3264 Balanced Lineup(模板题)【RMQ】
    poj 3368 Frequent values(经典)【RMQ】
    SPOJ RPLN (模板题)(ST算法)【RMQ】
    UVA 796 Critical Links(模板题)(无向图求桥)
    UVA 315 Network (模板题)(无向图求割点)
    POJ 2029 Get Many Persimmon Trees (模板题)【二维树状数组】
    poj 3067 Japan 【树状数组】
    POJ 2481 Cows 【树状数组】
    POJ 1195 Mobile phones【二维树状数组】
  • 原文地址:https://www.cnblogs.com/cobbliu/p/2388550.html
Copyright © 2011-2022 走看看