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的更多相关文章

  1. 【hibernate】之标注枚举类型@Enumerated(转载)

    实体Entity中通过@Enumerated标注枚举类型,例如将CustomerEO实体中增加一个CustomerType类型的枚举型属性,标注实体后的代码如下所示. @Entity @Table(n ...

  2. 转载 - C - 枚举类型详解

    出处:http://www.cnblogs.com/JCSU/articles/1299051.html 注:以下全部代码的执行环境为VC++ 6.0 在程序中,可能需要为某些整数定义一个别名,我们可 ...

  3. 枚举类型C语言规律用法总结

    注:以下全部代码的执行环境为VC++ 6.0 在程序中,可能需要为某些整数定义一个别名,我们可以利用预处理指令#define来完成这项工作,您的代码可能是: #define MON  1#define ...

  4. C#语言基础——结构体和枚举类型

    结构体和枚举类型 一.结构体(struct) 结构类型是用户自己定义的一种类型,它是由其他类型组合而成的,可包含构造函数.常数.字段.方法.属性.索引器.运算符.事件和嵌套类型的值类型.结构在几个重要 ...

  5. C#(结构体_枚举类型)

        结构体一般定义在Main函数上面,位于Class下面,作为一个类:一般情况Struct定义在Main函数前面,Main函数里面的地方都可以使用,参数前面加上public代表公用变量. 用法 1 ...

  6. [c/c++] programming之路(28)、结构体存储和内存对齐+枚举类型+typedef+深拷贝和浅拷贝

    一.结构体存储 #include<stdio.h> #include<stdlib.h> struct info{ char c; //1 2 4 8 double num; ...

  7. 结构体struct、联合体union、枚举类型enum

    1.c语言中的类型 1)内置类型——char,short,int,float,double: 2)用户自定义类型(UDT)——struct结构体,union联合体,enum枚举类型 2.内存对齐 2. ...

  8. c# 结构体、枚举类型及函数调用

    一.结构体 结构体:就是一个自定义的集合,里面可以放各种类型的元素,用法大体跟集合一样. 枚举类型和结构体都属于值类型. 二.枚举类型 1.枚举类型之针对字符串,对于索引,无意义2.常量的集合,这些常 ...

  9. C#枚举类型和结构体

    注意:枚举类型和结构体都属于值类型. 结构体:就是一个自定义的集合,里面可以放各种类型的元素,用法大体跟集合一样. 一.定义的方法: struct student { public int nianl ...

随机推荐

  1. AIX学习笔记(更新中)

    AIX操作系统基本命令 系统的进入和退出login: 输入用户名(例如:user01)password: 输入用户口令若用户名及口令均正确,则用户将登陆成功.此时系统会出现命令提示符 $或#,即表示可 ...

  2. /var/spool/postfix/maildrop小文件太多造成inode索引使用完解决

    /var/spool/postfix/maildrop 小文件太多造成inode索引使用完解决办法 问题表现和检查: 1.运行df -i / 查看inode使用是否满: 2.查看/var/spool/ ...

  3. web.config里面使用configSource

    在asp.net中如果修改了配置文件web.config以后,会导致应用程序重启,所有回话(session)丢失掉,在 .NET Framework 2.0 以后的版本中,可以在一个单独文件中包括所有 ...

  4. 原生js学习笔记2

    知识点: 1:关于this指向问题,如果有函数a(),直接a()那么this指向window,new a()指向函数本身. 2:关于null和undefined.两者如果用“==”则认为两者是相等的, ...

  5. Linux下用freetds连接mssql中文乱码的问题【参考1】

    由于工作原因我们需要通过php访问我们以前的Sql Server 2005数据,所以就有了这篇文章的诞生.废话就少说了,做程序设计的最不喜欢兜圈子了.用简介步骤说明问题,往下看.系统:   Linux ...

  6. [转]解决win8.1右键菜单出现在左边

    1.在控制面板中找到“Tablet PC 设置”窗口,选择“其他”选项卡. 2.在“左右手使用习惯”下,点选“惯用左手”,确定. •如果win8.1的控制面板里找不到Tablet PC 设置 •可以在 ...

  7. tomcat中的get、post区别

    最近做一个项目,前台传到后台的数据是乱码.看着代码应该是正确的,但是就是有问题,然后请教了旁边的老司机才找到问题是什么.话不多说,下面是模拟情景的代码,其实也很简单,前台一个form表单,post   ...

  8. Python的 is 运算符

    1. is运算符判断的是同一性而不是相等性. #x和y都绑定到同一个列表,而z被绑定在另外一个具有相同数值和顺序的列表上 x = y = [1, 2, 3] z = [1, 2, 3] x == y ...

  9. ARM寄存器的8种寻址方式01

    一.立即数寻址 操作数由指令本身给出 MOV r0,#0x0F //是所有寻址方式里面速度最快的,但是受到合法立即数的限制 立即数要求以#和$开头 十六进制,#后跟0x:十进制,#后直接加:八进制,# ...

  10. C++实现设计模式之 — 简单工厂模式

    作者:jostree 转载请注明出处 http://www.cnblogs.com/jostree/p/4251756.html 所谓简单工厂模式,是一种实例化对象的方式,只要输入需要实例化对象的名字 ...