C++学习基础十五--sizeof的常见使用
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的常见使用的更多相关文章
- 学习笔记:CentOS7学习之十五: RAID磁盘阵列的原理与搭建
目录 学习笔记:CentOS7学习之十五: RAID磁盘阵列的原理与搭建 14.1 RAID概念 14.1.1 RAID几种常见的类型 14.1.2 RAID-0工作原理 14.1.3 RAID-1工 ...
- Bootstrap<基础十五> 输入框组
Bootstrap 支持的另一个特性,输入框组.输入框组扩展自 表单控件.使用输入框组,可以很容易地向基于文本的输入框添加作为前缀和后缀的文本或按钮. 通过向输入域添加前缀和后缀的内容,您可以向用户输 ...
- python3.4学习笔记(十五) 字符串操作(string替换、删除、截取、复制、连接、比较、查找、包含、大小写转换、分割等)
python3.4学习笔记(十五) 字符串操作(string替换.删除.截取.复制.连接.比较.查找.包含.大小写转换.分割等) python print 不换行(在后面加上,end=''),prin ...
- 201671010140. 2016-2017-2 《Java程序设计》java学习第十五周
java学习第十五周 Java的GUI界面设计,框架以及主要部件填充,归置,布局管理,在第十一章和第十二章进行了系统的学习,在这两章的知识奠基下,可以简单的构造一个GUI用户界面,在两周的学习后,可以 ...
- 风炫安全WEB安全学习第二十五节课 利用XSS键盘记录
风炫安全WEB安全学习第二十五节课 利用XSS键盘记录 XSS键盘记录 同源策略是浏览器的一个安全功能,不同源的客户端脚本在没有明确授权的情况下,不能读写对方资源.所以xyz.com下的js脚本采用a ...
- (C/C++学习笔记) 十五. 构造数据类型
十五. 构造数据类型 ● 构造数据类型概念 Structured data types 构造数据类型 结构体(structure), 联合体/共用体 (union), 枚举类型(enumeration ...
- Linux学习之十五、基础正规表示法\延伸正规表示法
原文地址: http://vbird.dic.ksu.edu.tw/linux_basic/0330regularex_2.php 基础正规表示法 既然正规表示法是处理字串的一种表示方式,那么对字节排 ...
- salesforce 零基础开发入门学习(十五)salesforce中formula的使用(不含Date/Time)
本文参考官方的formula介绍PDF:https://resources.docs.salesforce.com/200/latest/en-us/sfdc/pdf/salesforce_usefu ...
- javascript基础学习(十五)
javascript之cookie 学习要点: cookie介绍 创建与获取cookie cookie的编码 cookie的生存期 cookie的路径 cookie的domain cookie的sec ...
随机推荐
- Selenium2+python自动化43-判断title(title_is)
From: https://www.cnblogs.com/yoyoketang/p/6539117.html 前言 获取页面title的方法可以直接用driver.title获取到,然后也可以把获取 ...
- Solr 自定义排序[1]
需求:商品排序,无库存的商品排在后面(排序). 搜索: 默认搜索: df: 可以看出左图第1个.第 ...
- SVM的sklearn实现
转载:豆-Metcalf 1)SVM-LinearSVC.ipynb-线性分类SVM,iris数据集分类,正确率100% """ 功能:实现线性分类支持向量机 说明:可以 ...
- Schiff Move Free维骨力这个牌子的保健效果怎么样,是要给中老年人群服用的
Schiff Move Free维骨力这个牌子的保健效果怎么样,是要给中老年人群服用的.? https://www.zhihu.com/question/46399868 服move free还要补钙 ...
- VLAN 及 GVRP 配置
一.VLAN配置 +进入vlan视图,如果指定的vlan没有创建则先创建它 [undo]vlan vlan_id undo vlan 剔除已创建的vlan VLAN_id:要进入的或要创建并进入的VL ...
- Django中的路由配置简介
Django中的路由配置简介 路由配置(URLconf)就是Django所支撑网站的目录.其实,我们利用路由交换中的"寻址"的概念去理解Django的路由控制会简单很多,它的本质就 ...
- 初始化ha环境下的hadoop的hdfs
1)启动zookeeper2)启动所有的journalnode[hadoop@datanode1 ~]$ ~/hadoop-2.7.3/sbin/hadoop-daemon.sh start jour ...
- Android拨打接听电话自动免提
权限: <uses-permission android:name="android.permission.READ_PHONE_STATE"/> <uses-p ...
- FIN vs RST in TCP connections different
question: The way I understand this, there are 2 ways to close TCP connection: send FIN flag send RS ...
- locals()和globals()
都是获取当前作用域的内容: locals() 获取局部作用域的所有内容 函数内:获取locals()之前的,当前作用阈所有内容 函数外:获取打印前, 当前的作用域所有内容 在闭包内: 会把使用到的外层 ...