在C语言中,枚举(enum
)和共用体(union
)的大小计算方式略有不同,下面分别解释:
枚举(enum
)
枚举本身不占用存储空间,它只是一个类型别名,用于为整数值提供有意义的名称。但是,枚举值在内存中以整数的形式存在。枚举类型的大小取决于编译器和具体的实现,但通常它的大小与能够容纳枚举中最大值的整数类型的大小相同。例如,如果枚举中的值都是非负的,并且小于256,那么枚举类型的大小可能是一个unsigned char
(8位)。如果枚举中的值超过了int
的范围,编译器可能会使用long
或long long
类型来存储枚举值。
需要注意的是,枚举类型的大小并不是固定的,因此不能像结构体(struct
)或共用体(union
)那样直接通过sizeof
操作符来获取其大小。但是,你可以通过声明一个枚举类型的变量,并使用sizeof
操作符来获取该变量的大小,从而间接地了解枚举类型的大小。
共用体(union
)
共用体的大小是其所有成员中最大的那个成员的大小。因为共用体的所有成员都使用同一块内存空间,所以整个共用体的大小不能小于其任何一个成员的大小。你可以使用sizeof
操作符来获取共用体的大小。
例如:
union MyUnion { | |
char c; | |
int i; | |
double d; | |
}; | |
printf("Size of MyUnion: %zu\n", sizeof(union MyUnion)); // 输出可能是 4, 8, 16 等,取决于系统和编译器 |
在这个例子中,union MyUnion
的大小将是char
、int
和double
类型中最大的那个类型的大小。在大多数现代系统上,double
类型的大小通常是8字节(64位),因此union MyUnion
的大小很可能是8字节。但是,这取决于具体的系统和编译器实现。
需要注意的是,尽管共用体可以包含不同类型的成员,但一次只能使用其中一个成员,因为所有成员都共享同一块内存空间。在访问共用体的成员之前,你通常需要设置一个标志或使用其他机制来跟踪当前正在使用哪个成员。
上面共用体的大小计算说的并不准确
实际上:
1.联合的大小至少是最大成员的大小。
2.当最大成员大小不是最大对齐数的整数倍的时候,就要对齐到最大对齐数的整数倍。
union Un1
{
char c[5]; //数组总大小为5,故该联合体大小至少是5,又元素类型为char,大小是1,对齐数也是1
int i; //大小是4,小于VS默认对齐数8,故此对齐数为4
}; //4>1,故此联合体的最大对齐数是4,5不是4的整数倍,因此联合体的大小为4*2=8
union Un2
{
short c[7]; //数组总大小为7*2=14,故该联合体大小至少是14,又元素类型为short,大小是2,对齐数也是2
int i; //对齐数是4
}; //4>2,故此联合体的最大对齐数是4,14不是4的整数倍,因此联合体的大小为4*4=16
//下面输出的结果是什么?
printf("%d\n", sizeof(union Un1)); //输出:8
printf("%d\n", sizeof(union Un2)); //输出:16