[转]sizeof计算空间大小的总结
原文链接:http://www.cnblogs.com/houjun/p/4907622.html
关于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计算空间大小的总结
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) ...
随机推荐
- Vue 基础自查——条件渲染和列表渲染
v-if和v-show的区别是什么? v-if和v-for为什么不能一起用? v-for中的key有什么作用? 1 v-if 和 v-show 1.1 作用 都用来控制元素的显示和隐藏 1.2 控制元 ...
- TDSQL | 在整个技术解决方案中HTAP对应的混合交易以及分析系统应该如何实现?
从主交易到传输,到插件式解决方案,每个厂商对HTAP的理解和实验方式都有自己的独到解法,在未来整个数据解决方案当中都会往HTAP中去牵引.那么在整个技术解决方案中HTAP对应的混合交易以及分析系统应该 ...
- 设置IDEA启动,不要自动打开上次使用时的项目
打开idea时自动加载最近编辑的项目,很费时间,关闭设置如下
- RDD的缓存
RDD的缓存/持久化 缓存解决的问题 缓存解决什么问题?-解决的是热点数据频繁访问的效率问题 在Spark开发中某些RDD的计算或转换可能会比较耗费时间, 如果这些RDD后续还会频繁的被使用到,那么可 ...
- 设计模式学习-使用go实现模板模式
模板模式 定义 模板模式的作用 优点 缺点 适用范围 代码实现 回调 模板模式 VS 回调 参考 模板模式 定义 模板模式(TemplateMethod):定义一个操作中的算法骨架,而将一些步骤延迟到 ...
- PAT A1024题解——高精度大数相加模板
PAT:A1024 Palindromic Number A number that will be the same when it is written forwards or backwards ...
- [hdu7076]ZYB's kingdom
不难发现,操作1可以看作如下操作:对于删去$a_{1},a_{2},...,a_{k}$后的每一个连通块(的点集)$V$,令$\forall x\in V,x$的收益加上$s$(其中$s=\sum_{ ...
- [atAGC050A]AtCoder Jumper
考虑二叉树的结构,但并不容易构造从叶子返回的边 (以下为了方便,将所有点编号为$[0,n)$) 对于$i$,选择$2i\ mod\ n$和$(2i+1)\ mod\ n$这两条出边 从二叉树的角度并不 ...
- [luogu4331]数字序列
令$a'_{i}=a_{i}+n-i$.$b'_{i}=b_{i}+n-i$,代价仍然是$\sum_{i=1}^{n}|a'_{i}-b'_{i}|$,但条件变为了$b'_{i}\le b'_{i+1 ...
- 【Tool】IntelliJ 搭建Node.js环境
IntelliJ IDEA 开发 Node.js 2019-07-29 14:12:34 by冲冲 1. 配置插件 在IDEA的 file -> setting -> Plugins, ...