原文链接:http://www.cnblogs.com/houjun/p/4907622.html

关于sizeof的总结
  1、sizeof的使用形式:sizeof(var_name)或者sizeof var_name
  2、变量名可以不用括号括住:sizeof a
  3、数据类型必须用括号括起来:sizeof(int)
  4、sizeof可以对表达式求值:sizeof(2+3.14),实际是sizeof(double)
  5、sizeof可以对函数调用求值,实际上是对返回值类型求值
  6、以下情况不能用sizeof进行求值
      1)不能对函数名求值
      2)不能对不确定返回值的类型求值,如void
      3)位域成员不可以使用sizeof求值
  7、sizeof的结果是size_t,它被定义为unsigned int类型。该类型保证容纳显示所建立的最大对象的字节大小。
  一般,在32位编译器下:
      sizeof(int):4
      sizeof(short):2
      sizeof(long):4
      sizeof(long long):8
      sizeof(float):4
      sizeof(double):8
      sizeof(char):1
      sizeof(p):4,(p为指针)
  在不同的系统中这些值不一样。

  8、sizeof与strlen()比较,在计算字符数组时,sizeof包含'\0',strlen()不包含'\0'
  9、32位系统下指针的sizeof是4字节,64位下是8字节
  10、对引用的sizeof,其实是对其所绑定的对象的sizeof
  11、对于C字符串,需要牢记C/C++中一个汉字占两个字节(Linux下3个字节),且字符串尾有空字符。
  12、对数组sizeof可以计算数组的大小
  13、数组作为形参时,数组名的sizeof是4个字节
  14、32bit系统中,int **a[3][4];sizeof(a)=48

  15、关于struct的空间计算
    很多公司喜欢在考察struct的空间计算,是的,我深有感受。
  struct的空间计算比较复杂,总体遵循两个规则:
      1)在windows32环境下,整体空间是占用空间最大的成员(的类型)所占字节的整数倍,在Linux+gcc环境下,若最大成员类型所占字节数超过4,如double是8,则整体空  间是4的整数倍即可。
      2)在windows32环境下,数据对其原则——内存结构体成员的先后顺序排列,当排到该成员变量时,其前面已经摆放的空间大小必须是该成员类型大小的整数倍,如果不够  则补齐,以此类推。但在Linux+gcc环境下,若成员类型超过4,如double是8,则前面已经摆放的空间大小是4的整数倍即可,不够则补全。
  win32环境下:在摆放时,思路是:
        1、首先把第一个成员放在地址为0的地方
        2、然后再根据第二个成员的类型大小寻找其摆放的起始位置,摆放起始位置必须是类型大小的整数倍,依次类推。
        3、最后,再计算整体空间是不是最大类型大小的整数倍。
  而在Linux+gcc环境下:摆放的思路是
        1、首先把第一个成员放在地址为0的地方
        2、如果一个单元装不下,则另放在一个单元地址的起始位置。
        3、最后,如果最大类型带下超过4,再计算整体空间是不是4的整数倍。

  16、含有结构体的结构体的空间计算:
        1)在windows32环境下,整体空间是子结构体与父结构体中,占用空间最大的成员(的类型)所占字节的整数倍,在Linux+gcc环境下,若最大成员类型所占字节数超过4,如  double是8,则整体空间是4的整数倍即可。
        2)在windows32环境下,数据对其原则——父结构体内存按照结构体成员的先后顺序排列,当排到子结构体成员时,其前面已经摆放的空间大小必须是该子结构体成员中最  大类型大小的整数倍,不够则补全,一次类推。
  win32环境下:在摆放时,思路是:
        1、首先把第一个成员放在地址为0的地方
        2、然后再根据第二个成员的类型大小寻找其摆放的起始位置,摆放起始位置必须是类型大小的整数倍,如果是子结构体,则寻找摆放的起始位置是子结构体中最大类型大小  的整数倍,依次类推。
        3、最后,再计算整体空间是不是父子结构体中最大类型大小的整数倍。
  Linux+gcc比较省内存,类型大小超过4,起始位置要是4的整数倍即可。

  17、含有数组的结构体的空间计算:
  在结构体中,数组是按照单个变量一个一个进行摆放,而不是视为整体,故包含数组的结构体对齐的方式比较特殊。
  如:
  struct S1
  {
      char a[8];
      int b;
  };
  sizeof(S1)=12,而不是16。

  18、含位域结构体的计算
  位域成员不能单独被去sizeof值,但是含有位域的结构体可以。
  使用位域有如下规则:
      1)如果相邻位域字段的类型相同,且其位宽之和小于类型的sizeof大小,则后面的字段将紧邻前面一个字段的存储,知道不能容纳为止。
      在vs2010下,一个int a:4,如果后面不是位域,则占4个字节,即其类型的大小。而在Dec-C++与gcc下,无论是不是位域,所占字节数以其实际占用字节数为准,即int   a:4,如果后面不是位域,仅占一个字节。
      2)如果相邻位域字段的类型相同,但其位宽之和大于类型的sizeof大小,则后面的字段将从新的存储单元开始,其偏移量为其类型大小的整数倍。
      3)如果相邻位域字段的类型不同,不同编译器的具体实现有差异,VC6不采取压缩,而Dec-C++与gcc采用压缩。
      4)如果位域字段之间穿插着非位域字段,则不进行压缩。
      5)整体结构体的总大小为最快基本类型成员大小的整数倍。
  19、使用"#pragma pack"时结构体空间计算
  一般可以通过下面的方法来改变默认条件的对其条件:
  使用伪指令#pragma pack(n),编译器将按照n个字节对齐;
  使用伪指令#pragma pack(n),将取消自定字节对齐方式。
  以上两种指令通常应该搭配使用。
  #pragma pack(n),n为字节对齐数,其取值为1、2、4、8、16等,默认是8,如果这个值比结构体的sizeof值小,那该成员的偏移量应该以此为准,即结构体成员的偏移量应  该取二者的最小值。公式如下:
  offsetof(item)=min(n,sizeof(item))

  20、union的空间计算
  联合体的sizeof值是所有成员sizeof的最大值。

  21、枚举的空间计算
  enum只是定义了一个常量集合,里面没有“元素”,而枚举是当做int类型存储的,故枚举类型的sizeof值为4。

[转]sizeof计算空间大小的总结的更多相关文章

  1. sizeof计算空间大小的总结

    sizeof,看起来还真不简单,总结起来还是一大堆的东西,不过这是笔试面试中出现比较频繁的,我也是考过才觉得很重要,有些规则如果不注意,还真是拿到一道题目摸不着头脑,所有总结一下,方面忘记的时候瞄一瞄 ...

  2. sizeof()计算

    本节包含sizeof()计算结构体,位域,数组,字符串,指针,c++中的class等类型的大小,sizeof()计算的大小都是以字节为单位. 一 计算基本类型的长度 sizeof(char): 1 s ...

  3. c++面试常用知识(sizeof计算类的大小,虚拟继承,重载,隐藏,覆盖)

    一. sizeof计算结构体 注:本机机器字长为64位 1.最普通的类和普通的继承 #include<iostream> using namespace std; class Parent ...

  4. C++中类的内存空间大小(sizeof)分析

    注意类大小与结构体大小还是有一些不同的,类里面还包含成员函数(特别是虚函数),结构体中一般只有数据成员. 首先明确各数据类型占多大的空间.例如int到底是占2字节还是4字节空间: 在TC里,int是2 ...

  5. Zabbix数据库空间大小使用计算

    一.Zabbix的数据存储主要分类 1.历史数据 2.趋势数据 3.事件数据 二.每秒处理的数据量 顾名思义,例如,有3000个监控项(item),每60秒取一次值,即平均每秒有50(3000/60) ...

  6. 你必须知道的指针基础-4.sizeof计算数组长度与strcpy的安全性问题

    一.使用sizeof计算数组长度 1.1 sizeof的基本使用 如果在作用域内,变量以数组形式声明,则可以使用sizeof求数组大小,下面一段代码展示了如何使用sizeof: ,,,,,}; int ...

  7. Struct和Union的sizeof计算

    struct 结构体的大小不是简单的成员相加,要考虑存储空间的字节对齐 1.空结构体的大小为1 2.含有static的结构体在计算大小时不算上static变量,因为static存储在全局数据空间,而s ...

  8. Ubuntu 查看文件以及磁盘空间大小管理

    (1)查看文件大小  查看当前文件夹下所有文件大小(包括子文件夹)    du -sh   # du -h15M     ./package16K     ./.fontconfig4.0K    . ...

  9. postgresql基本操作:查看数据库、索引、表、表空间大小

    一.简介 PostgreSQL 提供了多个系统管理函数来查看表,索引,表空间及数据库的大小,下面详细介绍一下. 二.数据库对象尺寸函数 函数名 返回类型 描述 pg_column_size(any) ...

随机推荐

  1. Vue 基础自查——条件渲染和列表渲染

    v-if和v-show的区别是什么? v-if和v-for为什么不能一起用? v-for中的key有什么作用? 1 v-if 和 v-show 1.1 作用 都用来控制元素的显示和隐藏 1.2 控制元 ...

  2. TDSQL | 在整个技术解决方案中HTAP对应的混合交易以及分析系统应该如何实现?

    从主交易到传输,到插件式解决方案,每个厂商对HTAP的理解和实验方式都有自己的独到解法,在未来整个数据解决方案当中都会往HTAP中去牵引.那么在整个技术解决方案中HTAP对应的混合交易以及分析系统应该 ...

  3. 设置IDEA启动,不要自动打开上次使用时的项目

    打开idea时自动加载最近编辑的项目,很费时间,关闭设置如下

  4. RDD的缓存

    RDD的缓存/持久化 缓存解决的问题 缓存解决什么问题?-解决的是热点数据频繁访问的效率问题 在Spark开发中某些RDD的计算或转换可能会比较耗费时间, 如果这些RDD后续还会频繁的被使用到,那么可 ...

  5. 设计模式学习-使用go实现模板模式

    模板模式 定义 模板模式的作用 优点 缺点 适用范围 代码实现 回调 模板模式 VS 回调 参考 模板模式 定义 模板模式(TemplateMethod):定义一个操作中的算法骨架,而将一些步骤延迟到 ...

  6. PAT A1024题解——高精度大数相加模板

    PAT:A1024 Palindromic Number A number that will be the same when it is written forwards or backwards ...

  7. [hdu7076]ZYB's kingdom

    不难发现,操作1可以看作如下操作:对于删去$a_{1},a_{2},...,a_{k}$后的每一个连通块(的点集)$V$,令$\forall x\in V,x$的收益加上$s$(其中$s=\sum_{ ...

  8. [atAGC050A]AtCoder Jumper

    考虑二叉树的结构,但并不容易构造从叶子返回的边 (以下为了方便,将所有点编号为$[0,n)$) 对于$i$,选择$2i\ mod\ n$和$(2i+1)\ mod\ n$这两条出边 从二叉树的角度并不 ...

  9. [luogu4331]数字序列

    令$a'_{i}=a_{i}+n-i$.$b'_{i}=b_{i}+n-i$,代价仍然是$\sum_{i=1}^{n}|a'_{i}-b'_{i}|$,但条件变为了$b'_{i}\le b'_{i+1 ...

  10. 【Tool】IntelliJ 搭建Node.js环境

    IntelliJ IDEA 开发 Node.js 2019-07-29  14:12:34  by冲冲 1. 配置插件 在IDEA的 file -> setting -> Plugins, ...