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. TeamViewer 的早期版本下载

    对于10及上以的:https://www.teamviewer.com/zhcn/download/previous-versions/ 5~9的版本下载:https://community.team ...

  2. ThinkPHP 3.1.2 视图 MVC-V -5

    一.模板的使用        (重点) a.规则 模板文件夹下[TPL]/[分组文件夹/][模板主题文件夹/]和模块名同名的文件夹[Index]/和方法名同名的文件[index].html(.tpl) ...

  3. JFrame关闭程序就退出的设置

    要是实现JFrame 关闭后程就退出或者停止可以调用setDefaultCloseOperation() 方法. 入下图程序 package ltb6w; import javax.swing.*; ...

  4. zzzp0371 属于本人

    所有关于zzzp0371账号,属于本人 如有问题,请在此留言联系我

  5. Ubuntu 14.10 下安装伪分布式hdoop 2.5.0

    折腾了一天,其间配置SSH时候出现了问题,误删了ssh-keygen相关文件,导致配置SSH彻底萎了,又重装了系统.... 采用伪分布式模式,即hadoop将所有进程运行于同一台主机上,但此时Hado ...

  6. Python——pandas读取JSON数据,xml,html数据(python programming)

  7. NodeJs之配置文件管理

    查询了一些资料,我使用nodejs的object作为配置文件,首先定义一个module config.js: var config = { uploadPath: "E:\\" } ...

  8. Hadoop+Hbas完全分布式安装部署

    Hadoop安装部署基本步骤: 1.安装jdk,配置环境变量. jdk可以去网上自行下载,环境变量如下: 编辑  vim  /etc/profile 文件,添加如下内容: export JAVA_HO ...

  9. Linux中/目录扩容

    1:原来的系统20G,目前增加到30G,我要把增加的10G扩容到/目录下   2:fdisk /dev/sda     (对sda这块磁盘没有被使用的空间进行分区,联想Windows操作系统) 使用L ...

  10. Oracle SQL:select各类查询语句总结

    SQL查询语句总结 数据查询语言:即DML(Data Mannipulation Language)数据操纵语言,用于查询.操纵数据表资料行 本手册所有示例引用表均以TIPTOP GP  ERP数据库 ...