您的位置:首页 > 其它

enum枚举类型与union联合类型

2008-12-09 10:37 260 查看
在C语言中有一种对软件工程来讲,可以大大提高程序可读性的数据类型,那就是枚举(enum)。一般的定义方式如下:
enum enum_type_name{
ENUM_CONST_1,
ENUM_CONST_2,
...
ENUM_CONST_n
} enum_variable_name;
enum_type_name是自定义的一种数据数据类型,而enum_variable_name为enum_type_name类型的一个变量。实际上enum_type_name类型是对一个变量取值范围的限定,而花括号内是它的取值范围,即enum_type_name 类型的变量 enum_variable_name只能取值为花括号内的任何一个值,如果赋给该类型变量的值不在列表中,则会报错或者警告。

实际上在此定义了一组常量:ENUM_CONST_1、ENUM_CONST_2、...、ENUM_CONST_n,这些常量可以用来给任何一种类型的数据赋值,在这种意义下与#define定义的常量几乎没有区别。
enum变量类型还可以给其中的常量符号赋值,如果不赋值则会从被赋初值的那个常量开始依次加1,如果都没有赋值,它们的值从0开始依次递增1。如分别用一个常数表示不同颜色
typedef enum{
GREEN = 1,
RED,
BLUE,
GREEN_RED = 10,
GREEN_BLUE
}Color.
其中各常量名代表的数值分别为:
GREEN = 1
RED = 2
BLUE = 3
GREEN_RED = 10
GREEN_BLUE = 11

union和struct类型的大小计算

union和struct类型的大小计算:

对于union,对齐的大小是最大的基本元素的对齐大小,对象的大小必须是该基本元素大小的整数倍。
如:
Union U1
{
Char a[9];
Int
b;
};
对齐为4字节对齐,大小为大于9并且为4的倍数,为12。
若其中的int b改为double,则对齐为8,大小为16。

复杂一点的情况:
Union U2
{
U1 a;
Double b;
};
对齐是double的大小,为8,大小应当为是16。

对于stuct,对齐的大小也是最大的基本元素的对齐的大小,对象的大小需要考虑元素的对齐,并且需要是最大基本元素的整数倍。

Struct S1
{
Char a[13];
Double c;
};
对齐大小为8,大小为24。

Struct S2
{
S1 a;
U1 b;
};
S1对齐大小为8,U1对齐大小为4,因此S2的对齐大小8,体积大小为大于24+12且要为8的倍数,结果为40。

这里所说的union和struct的对齐,是指其作为其他复杂对象中的元素的时候要求的对齐,对于本身大小的计算并没有关系。本身的大小只和其所包含的基本元素的对齐有关系。

struct的大小和内部元素的排列是有很大关系的,因此在使用struct的时候,安排好元素的位置,可以减少结构体的大小。
如:
Struct S3
{

char b;

int
c;

char d[13];
};
根据之前的原则,因为c需要4字节对齐,因此b之后会有3字节空余。所以1+3(空余)+4+13=21,要求为4的倍数,则为24。
若更改为
Struct S4
{
Char b;
Char d[13];
Int c;
}
则c之前会空余2字节,所以1+13+2+4=20,并且已经为4的倍数,所以大小就是20。

关于#pragma_pack(),该标示用于重新指定对齐的大小,当元素的对齐大于指定的对齐大小的时候,会采用指定的大小,若小于,则指定的对齐大小不会产生效果。
如:
Union U3
{
Char a[9];
Double b;
};
该union的对齐为8,大小为16(大于9且为8的倍数)。
若加上
#pragma_pack(4)
则对于U3中的基本元素b,其对齐由原来的8变为4,而a的对齐仍然是1,则U3的对齐为4,大小为12。
当然U3的对齐也由8变成了4。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: