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

关于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计算空间大小的总结

    原文链接:http://www.cnblogs.com/houjun/p/4907622.html 关于sizeof的总结 1.sizeof的使用形式:sizeof(var_name)或者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. linux下安装pip

    1.pip下载安装 wget "https://pypi.python.org/packages/source/p/pip/pip-1.5.4.tar.gz#md5=834b2904f92d ...

  2. java 如何将 word,excel,ppt如何转pdf --openoffice (1)

    承上启下,可折叠 上一篇说的是:服务器是windows server时,用jacob将msoffice(指的是word,excel,ppt)转换成pdf. 若被部署项目的服务器是centOS等linu ...

  3. MVVM之旅(1)创建一个最简单的MVVM程序

    这是MVVM之旅系列文章的第一篇,许多文章和书喜欢在开篇介绍某种技术的诞生背景和意义,但是我觉得对于程序员来说,一个能直接运行起来的程序或许能够更直观的让他们了解这种技术.在这篇文章里,我将带领大家一 ...

  4. WTF小程序之wxs

    前言 对于从VUE过来的前端同学来说,见到小程序的第一眼一定是熟悉-感觉就像是把vue的单文件拆成了3个文件.但是,随着慢慢入坑.马上会发现,这样怎么不行?wxs文件又是什么鬼?template和vu ...

  5. [DeeplearningAI笔记]ML strategy_2_2训练和开发/测试数据集不匹配问题

    机器学习策略-不匹配的训练和开发/测试数据 觉得有用的话,欢迎一起讨论相互学习~Follow Me 2.4在不同分布上训练和测试数据 在深度学习时代,越来越多的团队使用和开发集/测试集不同分布的数据来 ...

  6. 跟我一起读postgresql源码(十六)——Executor(查询执行模块之——control节点(下))

    5.ModifyTable节点 先看一个ModifyTable节点的例子: postgres=# explain update test_01 set id = 5 where name = 'xxx ...

  7. COGNOS安装与发布报表步骤

    1. 安装 1.1安装前准备 安装COGNOS需要先安装好iis和sql Server(因为我们用的数据库系统就是SQLServer). 1.2安装过程 1)    找到BI Server文件 2)  ...

  8. 使用zii.widgets.CDetailView显示内容

    Yii里的CDetailView可以用来显示详细内容,有时会遇到显示的html内容是被转义过的,也就是原本是要显示html样式的,结果显示出来的内容却是把html当作普通文本了. 先看一个CDetai ...

  9. RandomAccess接口的使用

    RandomAccess在类Collections的shuffle()方法中的使用:(jdk源码如下) /** * Randomly permute the specified list using ...

  10. C# 使用反射获取界面并传参

    // 通过反射创建类库中的实例 try { // 通过反射,获取模块 Assembly assembly = Assembly.LoadFrom(AppDomain.CurrentDomain.Bas ...