struct 简单来说就是一些相互关联的元素的集合,说是集合,其实它们在内存中的存放是有先后顺序的,并且每个元素都有自己的内存空间。那么按照什么顺序存放的呢?其实就是按你声明的变量顺序来存放的,下面先看一个例子:

struct sTest

{

int a;  //sizeof(int) = 4

char b;  //sizeof(char) = 1

shot c; //sizeof(shot) = 2

}x;

所以在内存中至少占用 4+1+2 = 7 byte。然而实际中占用的内存并不是7 byte,这就涉及到了字节对齐方式,可以参考转载的《struct 字节对齐分析》,介绍的还是不错的。

union 的不同之处就在于,它所有的元素共享同一内存单元,且分配给union 的内存 size 由类型最大的元素 size 来确定,如下的内存就为一个double 类型 size :

union uTest

{

int a;   //sizeof(int) = 4

double b;  //sizeof(double) = 8

char c;  //sizeof(char) = 1

}x;

所以分配的内存 size 就是8 byte。

既然是内存共享,理所当然地,它不能同时存放多个成员的值,而只能存放其中的一个值,就是最后赋予它的值,如:

x.a = 3; x.b = 4.5; x.c = ‘A’;

这样你只看到x.c = ‘A’,而其它已经被覆盖掉,失去了意义。

说到这里,大家应该已经明白两者最关键的区别了吧,无非就在于内存单元的分配和使用。然而要灵活地使用 struct 和 union 还是存在许多小技巧的,比如:元素的相关性不强时,完全是可以使用union ,从而节省内存size; struct和 union 还可以相互嵌套。

http://blog.163.com/zhangsumei0712@126/blog/static/1043778322008111194755670/?COLLCC=3146474783&

http://www.letuknowit.com/archives/81

出个题,union{long,int k[5],char c}Date;

struct{int,char,Date,char c[6]}AA;

那么,sizeof(Date)+sizeof(AA)=???

首先很容易看出来union的大小为20,那么接下来看看struct,int(4)+char(1)=5,Date中最长的类型为4(int和long),那么5不是4的倍数,所以添加3,那么=8是4的倍数了,接着8+Date(20)=28,是1(char)的倍数,总长,28+6(char c【6】)=34,而且,struct中最长的类型为4(int以及Date中最长的类型),但是呢,34不是4的整数倍,需要+2补齐,所以sizeof(AA)=36。所以呢,sizeof(Date)+sizeof(AA)=36+20=56,这个是宇视的笔试题,当时想了好久。。哈哈

至于struct的规则呢,请看http://blog.csdn.net/sun5smile/article/details/8919469

struct与unin的区别相关推荐

  1. struct 与class 的区别?

    struct 与class 的区别? 1)在C++里struct 关键字与class 关键字一般可以通用,只有一个很小的区别.struct 的成员默认情况下属性是public 的,而class 成员却 ...

  2. C与C++中struct及C++中struct与class的区别

    C++中struct与class的区别 struct class 备注 成员函数 能 能 均有构造函数及析构函数 继承性 能 能 多态性 能 能 均有虚函数 默认成员属性 public private ...

  3. C++中Struct和Class的区别

    Struct和Class的区别 今天这篇博文主要讲解在C++中关键字struct和class的区别.这篇博文,将会系统的将这两个关键字的不同面进行详细的讲解. 从语法上来讲,class和struct做 ...

  4. C#中struct和class的区别详解

    本文详细分析了C#中struct和class的区别,对于C#初学者来说是有必要加以了解并掌握的. 简单来说,struct是值类型,创建一个struct类型的实例被分配在栈上.class是引用类型,创建 ...

  5. c#中struct和class的区别

    简单来说,struct是值类型,创建一个struct类型的实例被分配在栈上.class是引用类型,创建一个class类型实例被分配在托管堆上.但struct和class的区别远不止这么简单.本篇主要包 ...

  6. C# 中 Struct 与 Class 的区别,以及两者的适用场合

    C# 中 Struct 与 Class 的区别,以及两者的适用场合 先说区别,原文出处 http://www.dotnetspider.com/resources/740-Difference-bet ...

  7. struct与class的区别

    如何选择结构还是类 一.类与结构的示例比较: 结构示例: public struct Person { string Name; int height; int weight public bool ...

  8. 黑马程序员-Struct与Static的区别与联系?

    Struct与Static的区别与联系? 在C#的基础学习中,我对结构和方法总是容易混淆,一来二者长的太像,容易敲错:二来对它们的概念和用法理解不深,容易混淆.今天特此写篇博客来说明他们之间的区别与联 ...

  9. C++中结构体与类的区别(struct与class的区别)

    C++中的struct对C中的struct进行了扩充,它已经不再只是一个包含不同数据类型的数据结构了,它已经获取了太多的功能. struct能包含成员函数吗? 能! struct能继承吗? 能!! s ...

最新文章

  1. Coursera吴恩达《神经网络与深度学习》课程笔记(2)-- 神经网络基础之逻辑回归...
  2. vue对象深拷贝_Vue 对数据对象实现深拷贝赋值
  3. 关于static方法
  4. 各种Java加密算法
  5. ubuntu同时装有MXNet和Caffe框架
  6. 无重复字符串的最长子串 python
  7. android imageview scaletype 按钮状态,Android ImageView 之 ScaleType 详解
  8. Git - 命令行 - 使用 Tag 标记你的代码
  9. 火盈云库浅谈新老版本的对比和发展过程
  10. 单片机at89c51数字钟c语言,基于AT89C51单片机的数字钟设计
  11. 计算机开机弹出的今日热点怎么关闭
  12. Delphi程序破解技术概要
  13. 实现Office文档的在线查看等功能
  14. 微信表情的字符编号完整版【图文并茂哦!】
  15. 计算机网络个人简历范文,计算机网络个人简历范文
  16. HackTheBox::Seal
  17. HDU 6656 Kejin Player (期望DP 逆元)
  18. 深眸分享——机器视觉光源基础知识
  19. 项目启动报错: This is very likely to create a memory leak. Stack trace of thread 解决方案
  20. PHP--有道(百度)文字或语句转MP3音频文件

热门文章

  1. 深度学习-基础知识-经典网络
  2. php3D动画,html5的canvas实现几何模型3D运动动画效果
  3. 三星、华为和柔宇在MWC展示折叠屏手机:可看不可摸
  4. 全球AI研究报告发布!
  5. Mock.js进行独立于后端的前端开发
  6. 超市会员管理系统--课程设计
  7. 双十一购物狂欢节!顶级布局优雅实现京东支付宝主页效果!
  8. 企业微信营销怎么做?企业微信营销软件哪个好?
  9. 中国智造助力国货崛起 新国货爆品为何频频出圈?
  10. 各项异性滤波简介Anisotropic Filtering(AF)