所有栏目 | 云社区 美国云服务器[国内云主机商]
你的位置:首页 > 云社区 » 正文

在C语言里面,共用体和结构体的区别?

发布时间:2020-04-15 16:50:23

资讯分类:共用体  结构体  c语言  区别  共用  元素  结构
在C语言里面,共用体和结构体的区别?

首先你说的很对 共同体的确占的内存要比结构体小

结构体占用的内存空间,是其元素,占空间的总和,而共用体是,元素中占用空间最大的元素的空间!所以共用体在空间开销上要小一点!

但是既然是两个不同的概念当然是不一样的 要不就没必要定义两个名词了

其实在共用体所用的内存中已经写入了数据!当使用其它元素时!上次使用的内容将被覆盖. 也就是说他使几个不同类型的变量共占一段内存(相互覆盖),每次只有一个能使用

结构体则不然, 每个成员都会有存储空间的,可以一起用.内部变量间是相互独立的,c中的结构体和C++里的类很相像~~

在C语言里面,共用体和结构体的区别?

一般的实现上结构体布局是这样(暂不计位域和柔性数组):

首个成员偏移是 0 (标准要求)。

后一个成员需要在前一个成员之后(标准要求)。其偏移是保证该成员不与前一成员重叠的该成员对齐的最小整数倍。

结构体的对齐是各个成员对齐的最大值。结构体的大小是能保证放下最后成员的对齐的最小整数倍。

标准允许结构体有更大对齐或布局更加“松垮”一点(有更多空隙),但实现一般不会这样。

一般实现上数组类型的对齐同元素类型。

这里的规则无论成员和元素是否为结构体都成立。


按题主描述,测试所用的平台使用 LP64 数据模型,short 大小与对齐均为 2 字节, int 大小与对齐均为 4 字节, long 及指针大小与对齐均为 8 字节。

struct P1 { int a; char b; int c; char d; };

a 偏移为 0 , b 偏移为 4 , c 偏移为 8 (大于 4 + 1 的 4 的最小整数倍), d 偏移为 12 。 P1 对齐为 4 ,大小为 16 。

struct P2 { int a; char b; char c; long d; };

a 偏移为 0 , b 偏移为 4 , c 偏移为 5 , d 偏移为 8 。 P2 对齐为 8 , 大小为 16 。

struct P3 { short a[3]; char b[3]; };

a 偏移为 0 , b 偏移为 6 。 P3 对齐为 2 ,大小为 10 。

struct P4 { short a[3]; char *b[3]; };

a 偏移为 0 , b 偏移为 8 (大于 0 + 6 的 8 的最小整数倍)。 P4 对齐为 8 ,大小为 32 。

struct P5 { struct P3 a[2];struct P2 t;};

a 偏移为 0 , t 偏移为 24 (大于 0 + 20 的 8 的最小整数倍)。 P5 对齐为 8 ,大小为 40 。


C 中类型大小可用 sizeof 获取,类型对齐可用 _Alignof 获取,成员偏移可用宏 offsetof 获取。

留言与评论(共有 0 条评论)
   
验证码:
Top