sizeof的常见用法

1. 基本类型所占的内存大小

类型 32位系统(字节) 64位系统(字节)
char 1 1
int 4 4
short 2 2
long 4 8
float 4 4
double 4 8
指针 4 8

上表中是基本类型在不同平台上所占用的内存大小,例如sizeof(int) = 4。

2.sizeof计算数组占用的字节数

使用sizeof计算数组占用内存的字节数的计算方法是 类型字节数*数组长度。

例如:

 int m_aNums[];
sizeof(m_aNums);

使用sizeof计算m_aNums的字节数是12。

3.sizeof计算单层结构体的大小

结构体中的成员变量可以是不同类型,是根据声明的顺序依次存入内存。跟数组不同的是,结构体的大小不是成员变量大小的简单相加。

结构体所占内存大小的字节数是由结构体内最后一个成员变量的偏移量+最后一个成员变量的字节大小计算而得的。

计算结构体所占的字节数有两个规则:

(1)每个结构体内成员变量的偏移量必须是该变量大小的整数倍。

(2)计算得到的结构体的大小必须是结构体内每个成员变量大小的整数倍,即结构体大小的值是每个成员变量大小的最小公倍数。

例如:

 typedef struct {
int a;
double c;
short b;
}SA; typedef struct {
int a;
short b;
double c;
}SB;

结果:sizeof(SA) = 24;sizeof(SB) = 16。

分析:

注意:结构体内每个成员变量的偏移量 = 上一个成员变量偏移量 + 上一个成员变量的大小

SA结构体内:a的偏移量 = 0,a的大小 = 4;

c的偏移量 = 8,c的大小 = 8;(注意:c的偏移量不能是4,因此4不是c的大小的整数倍,因此c的偏移量必须补上4位变为8)

b的偏移量 = 16,b的大小 =  2;

计算得到结果24,不能是18,因为18不是4和8的最小公倍数,因此最后结果是需要补上6位得到其最小公倍数24。

SB结构体内:a的偏移量 = 0,a的大小 = 4;

      b的偏移量 = 4,b的大小 = 2;

      c的偏移量 = 8,c的大小 = 8;(注意:c的偏移量不能6,因为6不是c大小的整数倍,因此补上2位,变为8)

      计算得到结果是16。

从SA和SB两个结构体的计算大小可知,结构体内变量声明顺序的不同,会导致结构体所占大小的不同。

4.sizeof计算嵌套结构体的大小

sizeof计算嵌套结构体大小的计算规则:

(1)将嵌入的结构体展开,被展开的结构体的第一个成员变量的偏移量是被展开结构体中最大的成员变量大小的整数倍。

(2)最终计算的结构体的大小必须是所有成员变量大小的整数倍,这里所有成员变量计算的是展开后的变量,而不是将嵌入的结构体作为一个整体。

例如:

struct SC
{
short i;
struct
{
char c;
int j;
} ss;
int k;
}

sizeof(SC) = 16,其中ss.c的偏移量是4,而不是2。

C++学习基础十五--sizeof的常见使用的更多相关文章

  1. 学习笔记:CentOS7学习之十五: RAID磁盘阵列的原理与搭建

    目录 学习笔记:CentOS7学习之十五: RAID磁盘阵列的原理与搭建 14.1 RAID概念 14.1.1 RAID几种常见的类型 14.1.2 RAID-0工作原理 14.1.3 RAID-1工 ...

  2. Bootstrap<基础十五> 输入框组

    Bootstrap 支持的另一个特性,输入框组.输入框组扩展自 表单控件.使用输入框组,可以很容易地向基于文本的输入框添加作为前缀和后缀的文本或按钮. 通过向输入域添加前缀和后缀的内容,您可以向用户输 ...

  3. python3.4学习笔记(十五) 字符串操作(string替换、删除、截取、复制、连接、比较、查找、包含、大小写转换、分割等)

    python3.4学习笔记(十五) 字符串操作(string替换.删除.截取.复制.连接.比较.查找.包含.大小写转换.分割等) python print 不换行(在后面加上,end=''),prin ...

  4. 201671010140. 2016-2017-2 《Java程序设计》java学习第十五周

    java学习第十五周 Java的GUI界面设计,框架以及主要部件填充,归置,布局管理,在第十一章和第十二章进行了系统的学习,在这两章的知识奠基下,可以简单的构造一个GUI用户界面,在两周的学习后,可以 ...

  5. 风炫安全WEB安全学习第二十五节课 利用XSS键盘记录

    风炫安全WEB安全学习第二十五节课 利用XSS键盘记录 XSS键盘记录 同源策略是浏览器的一个安全功能,不同源的客户端脚本在没有明确授权的情况下,不能读写对方资源.所以xyz.com下的js脚本采用a ...

  6. (C/C++学习笔记) 十五. 构造数据类型

    十五. 构造数据类型 ● 构造数据类型概念 Structured data types 构造数据类型 结构体(structure), 联合体/共用体 (union), 枚举类型(enumeration ...

  7. Linux学习之十五、基础正规表示法\延伸正规表示法

    原文地址: http://vbird.dic.ksu.edu.tw/linux_basic/0330regularex_2.php 基础正规表示法 既然正规表示法是处理字串的一种表示方式,那么对字节排 ...

  8. salesforce 零基础开发入门学习(十五)salesforce中formula的使用(不含Date/Time)

    本文参考官方的formula介绍PDF:https://resources.docs.salesforce.com/200/latest/en-us/sfdc/pdf/salesforce_usefu ...

  9. javascript基础学习(十五)

    javascript之cookie 学习要点: cookie介绍 创建与获取cookie cookie的编码 cookie的生存期 cookie的路径 cookie的domain cookie的sec ...

随机推荐

  1. spring cloud和spring boot两个完整项目

    spring cloud和spring boot两个完整项目 spring cloud 是基于Spring Cloud的云分布式后台管理系统架构,核心技术采用Eureka.Fegin.Ribbon.Z ...

  2. docker-compose使用volume部署mysql时permission deny问题解决

    问题整体情况为使用docker做mysql的容器,然后结合其他服务一起通过docker-compose启动,并且为了一次性建表和设置用户权限我又在mysql中封装了setup.sh.schema.sq ...

  3. svn hooks post-commit钩子自动部署

    #!/bin/sh #修改为服务编码 export LANG=zh_CN.utf- #Set variable REPOS="$1" REV="$2" SVN= ...

  4. C#发布程序添加其他程序文件

    注:程序发布文件,默认只发布自身程序直接引用的相关文件(A程序). 如果需要添加其他程序(不同的应用程序B)文件,操作方法如下: 第一步:将B程序文件复制到A程序 第二步:将B程序文件右键--> ...

  5. 隐藏网页中DIV和DOM的各种方法

    记录一下各种隐藏html元素的方法 <!DOCTYPE html> <html> <head> <title></title> <me ...

  6. Multiresolution Analysis(多分辨率分析)

    [注意:本文中所有的傅里叶变换和反变换均含对称因子$\frac{1}{\sqrt{2\pi}}$,且$z=e^{-ik\omega}$] 1. 多分辨率分析 1.1 概念 多分辨率分析指的是一系列$L ...

  7. java.util.ConcurrentModificationException的解决办法

    今天在使用iterator.hasNext()操作迭代器的时候,当迭代的对象发生改变,比如插入了新数据,或者有数据被删除. 编译器报出了以下异常: Exception in thread " ...

  8. JavaEE Web 开发 链接 mysql 出现 Class.not found的错误

    明明在项目的library里头导入过mysql-connector.jar的包,但是在加载driver的时候eclipse一直报这个错误.解决方案其实很简单,就是同样的jar包在tomcat的安装目录 ...

  9. [转]一图读懂JVM架构解析

    每个Java开发人员都知道字节码经由JRE(Java运行时环境)执行.但他们或许不知道JRE其实是由Java虚拟机(JVM)实现,JVM分析字节码,解释并执行它.作为开发人员,了解JVM的架构是非常重 ...

  10. HTML-CSS font-family:中文字体的英文名称

    本文转自网络,找不到原地址了,在这里保留了作者名. font-family:中文字体的英文名称 ellisontang 发表于2011-07-15 16:33 宋体* SimSun 黑体* SimHe ...