sizeof计算空间大小的总结
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计算空间大小的总结的更多相关文章
- [转]sizeof计算空间大小的总结
原文链接:http://www.cnblogs.com/houjun/p/4907622.html 关于sizeof的总结 1.sizeof的使用形式:sizeof(var_name)或者sizeof ...
- sizeof()计算
本节包含sizeof()计算结构体,位域,数组,字符串,指针,c++中的class等类型的大小,sizeof()计算的大小都是以字节为单位. 一 计算基本类型的长度 sizeof(char): 1 s ...
- c++面试常用知识(sizeof计算类的大小,虚拟继承,重载,隐藏,覆盖)
一. sizeof计算结构体 注:本机机器字长为64位 1.最普通的类和普通的继承 #include<iostream> using namespace std; class Parent ...
- C++中类的内存空间大小(sizeof)分析
注意类大小与结构体大小还是有一些不同的,类里面还包含成员函数(特别是虚函数),结构体中一般只有数据成员. 首先明确各数据类型占多大的空间.例如int到底是占2字节还是4字节空间: 在TC里,int是2 ...
- Zabbix数据库空间大小使用计算
一.Zabbix的数据存储主要分类 1.历史数据 2.趋势数据 3.事件数据 二.每秒处理的数据量 顾名思义,例如,有3000个监控项(item),每60秒取一次值,即平均每秒有50(3000/60) ...
- 你必须知道的指针基础-4.sizeof计算数组长度与strcpy的安全性问题
一.使用sizeof计算数组长度 1.1 sizeof的基本使用 如果在作用域内,变量以数组形式声明,则可以使用sizeof求数组大小,下面一段代码展示了如何使用sizeof: ,,,,,}; int ...
- Struct和Union的sizeof计算
struct 结构体的大小不是简单的成员相加,要考虑存储空间的字节对齐 1.空结构体的大小为1 2.含有static的结构体在计算大小时不算上static变量,因为static存储在全局数据空间,而s ...
- Ubuntu 查看文件以及磁盘空间大小管理
(1)查看文件大小 查看当前文件夹下所有文件大小(包括子文件夹) du -sh # du -h15M ./package16K ./.fontconfig4.0K . ...
- postgresql基本操作:查看数据库、索引、表、表空间大小
一.简介 PostgreSQL 提供了多个系统管理函数来查看表,索引,表空间及数据库的大小,下面详细介绍一下. 二.数据库对象尺寸函数 函数名 返回类型 描述 pg_column_size(any) ...
随机推荐
- 自定义Func模块
自定义Func模块 (1)自定义模块步骤 (2)生成模块 [root@controller modules]# cd /usr/lib/python2.7/site-packages/func/min ...
- vsftp实现只能上传不能下载、删除权限配置
vsftpd可以对每个用户特别限制.只要给那个用户建立一个设置文件,然后在文件里设置 在vsftpd.conf里加user_config_dir=/etc/vsftpd/vsftpd_user_con ...
- Tomcat学习
一:项目默认部署路径: eclipse中,默认new一个server,项目默认会部署在:workspace\(工作空间)\.metadata\.plugins\org.eclipse.wst.serv ...
- HDU [P1281]棋盘游戏
二分图求最大匹配 我们以每一个格子为边,以行和列为两个集合,那么求二分图的最大匹配数就是最多能放车的数目,那么什么是重要点呢?就是删掉后会影响最大匹配数的匹配边. 我们求出最大匹配数后,枚举匹配边,将 ...
- BZOJ 3720: Gty的妹子树 [树上size分块]
传送门 题意: 一棵树,询问子树中权值大于$k$的节点个数,修改点权值,插入新点:强制在线 一开始以为询问多少种不同的权值,那道CF的强制在线带修改版,直接吓哭 然后发现看错了这不一道树上分块水题.. ...
- BZOJ 1018: [SHOI2008]堵塞的交通traffic [线段树 区间信息]
1018: [SHOI2008]堵塞的交通traffic Time Limit: 3 Sec Memory Limit: 162 MBSubmit: 3064 Solved: 1027[Submi ...
- C# 使用反射获取界面并传参
// 通过反射创建类库中的实例 try { // 通过反射,获取模块 Assembly assembly = Assembly.LoadFrom(AppDomain.CurrentDomain.Bas ...
- 输入url到渲染出页面的过程
输入地址 浏览器查找域名的 IP 地址 这一步包括 DNS 具体的查找过程,包括:浏览器缓存->系统缓存->路由器缓存... 浏览器向 web 服务器发送一个 HTTP 请求 服务器的永久 ...
- 个人微信接入图灵机器人(python版)
准备工作 itchat,requests 注册图灵账号,创建机器人,获取API-KEY 代码实现 import itchat from itchat.content import * import j ...
- Python中Template使用的一个小技巧
Python中Template是string中的一个类,可以将字符串的格式固定下来,重复利用. from string import Template s = Template("there ...