当union最大成员为基本类型时,能否使其尺寸大于该成员?
关于Union尺寸与最大原生成员的问题
一、示例代码是否会在某个系统打印不同尺寸?
会存在这样的系统。
C标准规定,union的大小需要满足两个核心条件:
- 至少能容纳其体积最大的成员;
- 必须是自身对齐要求的整数倍(union的对齐要求取所有成员对齐要求的最大值)。
如果某成员的对齐要求大于自身的大小,就会导致union的尺寸被向上取整到对齐要求的倍数,进而大于最大成员的实际大小。举个例子:
- 假设某系统中
long double的大小是16字节,但硬件要求它必须按32字节对齐; - 此时示例代码计算的
l是16(最大成员的大小),但sizeof(union Foo)会是32(满足对齐要求的最小合法尺寸); - 最终打印的两个数值就会出现差异。
这类场景可能出现在部分特殊架构的嵌入式系统,或是对浮点类型有严格对齐要求的老款处理器上。
二、如何手动生成尺寸大于最大原生成员的Union?
可以通过强制指定更高的对齐要求来实现,比如使用C11标准的_Alignas关键字,或是编译器扩展的__attribute__((aligned(N))):
#include <stdint.h> #include <stdio.h> // 用_Alignas指定64字节对齐 union Oversized { uintmax_t val; } _Alignas(64); int main(void) { printf("%zu %zu\n", sizeof(union Oversized), sizeof(uintmax_t)); // 若uintmax_t为8字节,输出会是 64 8 }
此时union的尺寸会被强制提升到指定的对齐值,远大于其唯一成员的实际大小。
三、遗漏的类型类别与正式名称
你提到的这些类型,在C标准里统称为标量类型(scalar types),具体包含:
- 算术类型:整数类型(含枚举类型)、浮点类型、复数类型;
- 指针类型:数据指针、函数指针;
- 原子标量类型:
_Atomic修饰的上述标量类型。
你可能遗漏了枚举类型(enum),它属于整数类型的子集,同样归为标量类型范畴。
内容的提问来源于stack exchange,提问作者12431234123412341234123
相关产品推荐
相关产品推荐

