Union: 共用体

Struct:结构体

两者的区别:

1:共用体和结构体都是由多个不同的数据类型成员组成, 但在任何同一时刻, 共用体只存放一个被选中的成员, 而结构体则存放所有的成员变量。

2:对于共用体的不同成员赋值,将会对其他成员重写, 原来成员的值就不存在了, 而对于结构体的不同成员赋值是互不影响的

3:内存分配不同

union的大小为其内部所有变量的最大值,按照最大类型的倍数进行分配大小
如:
typedef Union 
{
char c[10];
char cc1;
}u11;

typedef union 
{
char c[10];
int i;
}u22;

typedef union 
{
char c[10];
double d;
}u33;

sizeof(u11)结果是10
sizeof(u22)结果是12,按照sizeof(int)*3分配空间
sizeof(u33)结果是16,按照sizeof(double)*2分配空间。

结构体struct非配方法类似,也是按照最大类型的倍数进行分配大小,但是还与顺序有关
如:
typedef struct s1
{
char c;
double d;
}s11;

typedef struct s2
{
char c;
char cc;
double d;
}s22;

typedef struct s3
{
char c;
double d;
char cc;
}s33;

sizeof(s11)结果是应该是9,但是系统按照sizeof(double)*2分配,所以大小是16

sizeof(s22)结果是应该是10,但是系统按照sizeof(double)*2分配,所以大小是16,先分配8字节给c,c占用一个字节,剩余7字节可以存储cc,所以系统没有额外给cc分配内存。cc有了内存后剩余6字节无法存储d,系统就额外为d分配8字节,整个分配浪费内存6字节。

sizeof(s22)结果是应该是10,但是系统按照sizeof(double)*3分配,所以大小是24,因为和定义顺序有关,所以当给c分配8个字节之后,剩余7个字节无法存储d,所以系统又分配了8个字节给d,之后又分配8个自己给cc,分配完后浪费了14个字节的空间。所以,在定义结构体struct 的时候按照s33的顺序分配可以节省内存。

Struct 和 Union 的详细区别的更多相关文章

  1. <转> Struct 和 Union区别 以及 对内存对齐方式的说明

    转载地址:http://blog.csdn.net/firefly_2002/article/details/7954458 一.Struct 和 Union有下列区别: 1.在存储多个成员信息时,编 ...

  2. struct 和union的区别

    union ( 共用体):构造数据类型,也叫联合体  用途:使几个不同类型的变量共占一段内存(相互覆盖) struct ( 结构体 ):是一种构造类型 用途: 把不同的数据组合成一个整体——自定义数据 ...

  3. struct与 union的基本用法

    结构体与联合体是C语言的常见数据类型,可对C的基本数据类型进行组合使之能表示复杂的数据结构,意义深远,是优异代码的必备工具.一.        struct与 union的基本用法,在语法上union ...

  4. union和union all的区别

    UNION 写一篇联合查询(把前后两个表的查询结果集合在前表中)首先有个为什么需要 相同记录数?? 记错了.应该是union两张表的查询字段数目要一致,字段类型要相似相同的数据类型,至少是相似,可转化 ...

  5. 关于C中struct和union长度的详解

    这几天看<代码大全>中的第十三章---不常见的数据类型,里面讲解到了C语言中的struct以及对指针的解释,联想到以前看过相关的关于C语言中stuct长度的文章,只是现在有些淡忘了,因此今 ...

  6. Oracle之Union与Union all的区别

    如果我们需要将两个select语句的结果作为一个整体显示出来,我们就需要用到union或者union all关键字.union(或称为联合)的作用是将多个结果合并在一起显示出来. union和unio ...

  7. 【转】C/C++ struct/class/union内存对齐

    原文链接:http://www.cnblogs.com/Miranda-lym/p/5197805.html struct/class/union内存对齐原则有四个: 1).数据成员对齐规则:结构(s ...

  8. union与union all的区别

    首先说下union与join的区别 1.union是以行增加的方式,进行连接:join是以列增加的方式进行连接: 2.union连接查询的两个表的字段必须要一一对应,数目相等:join则没有要求,但是 ...

  9. union与union all 的区别

    Union与Union All的区别 如果我们需要将两个select语句的结果作为一个整体显示出来,我们就需要用到union或者union all关键字.union(或称为联合)的作用是将多个结果合并 ...

随机推荐

  1. UWSGI配置文件---ini和xml示例

    一   conf.ini文件: [uwsgi] http = $(HOSTNAME):9033 http-keepalive = 1 pythonpath = ../ module = service ...

  2. [转]hibernate三种状态详解

    本文来自 http://blog.sina.com.cn/u/2924525911 hibernate 三种状态详解 (2013-04-15 21:24:23) 转载▼   分类: hibernate ...

  3. Hibernate---基础配置

    hibernate.cfg.xml里可以设置一个值显示更详细的sql语句: <property name="format_sql">true</property& ...

  4. UIView Methods

    UIView翻译 (参考) 2011年04月12日 星期二 10:09 转载于:http://blog.csdn.net/tracylife/archive/2010/08/27/5842723.as ...

  5. mousewheel,DOMMouseScroll判断滚轮滚动方向

    firefox使用DOMMouseScroll,其他浏览器使用mousewheel 首先绑定一个滚动事件 //firefox使用DOMMouseScroll,其他浏览器使用mousewheel$(do ...

  6. sqlserver存储过程中,set rowcount 0是什么意思?

    一般在语句中使用set rowcount是为了使后续的查询.更新.删除操作只影响指定的行数比如 一起执行如下语句 set rowcount 1SELECT * FROM sysobjects结果只返回 ...

  7. python模块--ip地址转换为整数

    python整数与IP地址转换 [转] 我们有时会将一个整数与IP地址进行互换,用python代码实现很简单 将一个整数如2000000,变为一个IP地址的方式 >>> import ...

  8. Java设计模式遵循的七大原则

    最近几年来,人们踊跃的提倡和使用设计模式,其根本原因就是为了实现代码的复用性,增加代码的可维护性.设计模式的实现遵循了一些原则,从而达到代码的复用性及增加可维护性的目的,设计模式对理解面向对象的三大特 ...

  9. 11、手把手教你Extjs5(十一)模块界面的总体设计

    上一节中设计了一些模块自定义中用到的要素,为了直观起见,这一节先建立一个模块的主界面.看过我 模块管理常规功能自定义系统的设计与实现 博客的人应该会有所了解了.一个模块的主界面是一个Grid,在其上方 ...

  10. 利用jackson转成json字符串(ssh中)

    public String getJsonString(Object o){ ObjectMapper om = new ObjectMapper(); StringWriter sw = new S ...