结构体,公用体,枚举类型的sizeof
1)枚举类enum型空间计算
enum只是定义了一个常量集合,里面没有“元素”,而枚举类型是当做int来存储的,所以枚举类型的sizeof值都为4
enum color(red,pink,white,black)c;
void main()
{
cout<<sizeof(enum); //值为4
}
2)公用体union空间计算
公用体中的成员公用同一段内存,所以整个联合体的sizeof是所有成员中占用内存最大的成员的sizeof,联合体要考虑内存对齐,具体规则下面会讲
union st{
char a[];
int b[];
}s;
void mian()
{
cout<<sizeof(s); //值为12
}
结果分析:sizeof(a)=9*1=9,sizeof(b)=2*4=8,选两者中最大的一个,即9,考虑内存对齐,整体空间长度要是公用体中长度最大的数据类型的整数倍,在这里是int占用空间的整数倍,比9大的且是4的整数倍的最小数是12
3)结构体struct空间计算
- 首先空结构体的长度为1,之所以不是0,因为如果空结构体不占内存,则该结构的的变量将无法存取,且两个不同的空结构体无法区分
- 非空结构体的计算遵循以下两个原则:
1.整体空间是结构体中占用空间最大的类型所占字节数的整数倍。特殊:在32位Linux+gcc环境下,若最大的类型所占字节数超过4,如double是8,则整体空间大小是4的整数倍即可
2.数据对齐原则-内存按结构体成员的先后顺序排列,当排到该成员变量时,其前面所有成员已经占用的空间大小必须是该成员类型大小的整数倍,如果不够,则前面的成员占用的空间要补齐,使之成为当前成员类型的整数倍。特殊:在Linux+gcc环境下,若当前成员类型字节数超过4,则前面所有成员已经占用的孔家大小是4的整数倍即可,不够则补齐
范例:
- 结构体成员为普通数据类型成员:
struct s{
char a;
double b;
int c;
char d;
};
void main()
{
cout<<sizeof(s); //值为24
}
结果分析:首先s中最大的类型为double,长度为8;顺序存放s中的成员,sizeof(a)=1,占用一个字节,下一个成员b是double类型,占用8个字节,根据原则2,a占用的内存补齐8的整数倍,即补齐到8个字节,b从第9个字节开始存放,此时共占用16个字节,下一个成员c是int类型,占用4个字节,16是4的整数倍,不用补齐,顺序存放c,此时占用空间来到20,d占用一个字节,20+1=21,根据原则1,整体空间大小需是double类型长度的整数倍,需将21补齐到24个字节
- 结构体成员中存在其他结构体类型成员:
规则同上面基本相同,但计算时,设计到的倍数对齐,以子结构体中的最大成员类型占用的空间为基础,而不是将子结构体的整体空间为基础,具体如下:
1.整体空间是子结构体与父结构体中占用空间最大的类型所占字节数的整数倍。特殊:在32位Linux+gcc环境下,若最大的类型所占字节数超过4,如double是8,则整体空间大小是4的整数倍即可
2.数据对齐原则-内存按结构体成员的先后顺序排列,当排到子结构体成员时,其前面所有成员已经占用的空间大小必须是该子结构体成员中占用空间最大的类型大小的整数倍,如果不够,则前面的成员占用的空间要补齐,使之成为该类型大小的整数倍。特殊:在Linux+gcc环境下,若当前成员类型字节数超过4,则前面所有成员已经占用的孔家大小是4的整数倍即可,不够则补齐
struct s1{
char c;
int i;
}; struct s2{
char c1;
s1 s;
char c2;
}; void mian()
{
cout<<sizeof(s1)<<endl; //
cout<<sizeof(s2)<<endl; //
}
结果分析:
s1:c占一个字节,i占4个字节,存放i之前将其补齐到4个字节,i从第5个字节开始存放,此时整体空间大小是8,恰好是4的整数倍
s2:c1占一个字节,下一个成员s,这里sizeof(s)虽然等于8,但计算时前面占用空间只要是s中最大类型的空间长度的整数倍即可,s中最大类型是int,所以c1占用的内存补齐到4,然后存放s(注意这里存放的是s,而不是int占用的字节),已计算出sizeof(s)=8,此时整体空间来到12,c2占一个字节,12+1=13,根据原则1,整体空间大小需是父结构体和子结构体重最大类型长度int的整数倍,最近的是16.
结构体,公用体,枚举类型的sizeof的更多相关文章
- 【hibernate】之标注枚举类型@Enumerated(转载)
实体Entity中通过@Enumerated标注枚举类型,例如将CustomerEO实体中增加一个CustomerType类型的枚举型属性,标注实体后的代码如下所示. @Entity @Table(n ...
- 转载 - C - 枚举类型详解
出处:http://www.cnblogs.com/JCSU/articles/1299051.html 注:以下全部代码的执行环境为VC++ 6.0 在程序中,可能需要为某些整数定义一个别名,我们可 ...
- 枚举类型C语言规律用法总结
注:以下全部代码的执行环境为VC++ 6.0 在程序中,可能需要为某些整数定义一个别名,我们可以利用预处理指令#define来完成这项工作,您的代码可能是: #define MON 1#define ...
- C#语言基础——结构体和枚举类型
结构体和枚举类型 一.结构体(struct) 结构类型是用户自己定义的一种类型,它是由其他类型组合而成的,可包含构造函数.常数.字段.方法.属性.索引器.运算符.事件和嵌套类型的值类型.结构在几个重要 ...
- C#(结构体_枚举类型)
结构体一般定义在Main函数上面,位于Class下面,作为一个类:一般情况Struct定义在Main函数前面,Main函数里面的地方都可以使用,参数前面加上public代表公用变量. 用法 1 ...
- [c/c++] programming之路(28)、结构体存储和内存对齐+枚举类型+typedef+深拷贝和浅拷贝
一.结构体存储 #include<stdio.h> #include<stdlib.h> struct info{ char c; //1 2 4 8 double num; ...
- 结构体struct、联合体union、枚举类型enum
1.c语言中的类型 1)内置类型——char,short,int,float,double: 2)用户自定义类型(UDT)——struct结构体,union联合体,enum枚举类型 2.内存对齐 2. ...
- c# 结构体、枚举类型及函数调用
一.结构体 结构体:就是一个自定义的集合,里面可以放各种类型的元素,用法大体跟集合一样. 枚举类型和结构体都属于值类型. 二.枚举类型 1.枚举类型之针对字符串,对于索引,无意义2.常量的集合,这些常 ...
- C#枚举类型和结构体
注意:枚举类型和结构体都属于值类型. 结构体:就是一个自定义的集合,里面可以放各种类型的元素,用法大体跟集合一样. 一.定义的方法: struct student { public int nianl ...
随机推荐
- jQuery选择器之子元素过滤选择器Demo
测试代码: 07-子元素过滤选择器.html <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" & ...
- BootStraps 布局
<div class="container"> //创建一个容器 <div class="row"> //创建行,每行总有12个格数 ...
- freeCodeCamp:Missing letters
从传递进来的字母序列中找到缺失的字母并返回它. 如果所有字母都在序列中,返回 undefined. function fearNotLetter(str) { var arr = str.split( ...
- 【.NET基础】--委托、事件、线程(1)
1,委托 是存放方法的指针的清单,也就是装方法的容器 A, 新建winform项目[01委托],项目中添加dg_SayHi.cs 委托类 用于存储方法 namespace _01委托 { //定义委托 ...
- SkinSoft中.vssf样式文件在VS2005中的应用(图文)
前些天在项目中应用了皮肤控件,涉及到了(.ssk),也做了相应的记录. 但还是觉得.ssk的并不算满意,所以今天又粗略的研究了一下SkinSoft这个软件: 如题,他的作用就是自定义控件与窗体样式. ...
- 跟我一起学习ASP.NET 4.5 MVC4.0(四)(转)
前几个文章中介绍了一些关于MVC4.0的东东,今天我们来看一下登陆验证,也可以说是权限验证,即AuthorizeAttribute.这个可以使用在控制器Controller上,也可以使用在Action ...
- list转换成DataTable
list转换成DataTable类如下: public static DataTable ToDataTable<T>(this IList<T> datas) { DataT ...
- Java之经典Student问题2
创建5个学生对象给一个学生数组赋值,每个学生属性有:学号.姓名.年龄. 要求:1.给每个学生排序输出. 2.给所有学生年龄加1. 3.统计年龄大于20的学生人数. 在这里,我们用了compareT ...
- C# 上传图片前判断上传图片的宽和高
网上找了好久没有找到... 最后百度到了这句话“由上传的HttpPostFile的InputStream创建一个Image对象,然后想怎么处置就随便你了”. HTML代码: <asp:FileU ...
- C#.NET实现Word或Excel文件转为HTML文件
Word文件转html,返回相对路径 private string GetPathByDocToHTML(string strFile) { if (string.IsNullOrEmpty(strF ...