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. 1172 Hankson 的趣味题[数论]

    1172 Hankson 的趣味题 2009年NOIP全国联赛提高组  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 黄金 Gold 题解       题目描述 Descrip ...

  2. .NET DLL 保护措施详解(二)关于性能的测试

    先说结果: 加了缓存的结果与C#原生代码差异不大了 我对三种方式进行了测试: 第一种,每次调用均动态编译 第二种,缓存编译好的对象 第三种,直接调用原生C#代码 .net dll保护系列 ------ ...

  3. 物联网 WIFI 一键配置原理(smartconfig) ESP8266/QCA4004

    自从物联网 问世以来,如何使得物  能够联网 有了很多的方式,目前运用非常广的WIFI,今天就总结下自这个方面,也对于有需要的盆友 也希望有抛砖引玉之效果. 物联网:  智能硬件+APP+云 APP ...

  4. 九、Android学习笔记_ Android开发中使用软引用和弱引用防止内存溢出

    在<Effective Java 2nd Edition>中,第6条“消除过期的对象引用”提到,虽然Java有 垃圾回收机制,但是只要是自己管理的内存,就应该警惕内存泄露的问题,例如的对象 ...

  5. ORACLE 数据库概述以及Oracel数据库的安装、卸载、使用

    一:Orcale简介 1.发展史 1978年,Orcale诞生 1982年,Orcale3推出了,它是第一个能够运行在大型机和小型机上的关系型数据库 1997年,Orcale公司推出了基于java语言 ...

  6. 理解C#系列 / C#语言的特性

    C#语言的特性 大多数语句都已(;)结尾 用({})定义语句块 单行注释(//),多行注释(/*......*/)智能注释(///) 区分大小写 用namespace名称空间对类进行分类 在C#中的所 ...

  7. 20141103--SQL主键,外键

    设置主键: 右键表→设计,在需要的列上右键→设置主键 或者在创建表的时候,在想要作为索引的列后面加上 primary key create table biao3 ( [No.] int primar ...

  8. UI2_UIGesture

    // // ViewController.h // UI2_UIGesture // // Created by zhangxueming on 15/7/9. // Copyright (c) 20 ...

  9. Python深复制浅复制or深拷贝浅拷贝

    1. copy.copy 浅拷贝 只拷贝父对象,不会拷贝对象的内部的子对象.(比深拷贝更加节省内存)2. copy.deepcopy 深拷贝 拷贝对象及其子对象 用一个简单的例子说明如下: >& ...

  10. BeanDefinition的Resource定位——3

    1.我们重点看看AbstractRefreshableApplicationContext的refreshBeanFactory方法的实现,这个refreshBeanFactory被FileSyste ...