You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

当union最大成员为基本类型时,能否使其尺寸大于该成员?

关于Union尺寸与最大原生成员的问题

一、示例代码是否会在某个系统打印不同尺寸?

会存在这样的系统。

C标准规定,union的大小需要满足两个核心条件:

  1. 至少能容纳其体积最大的成员;
  2. 必须是自身对齐要求的整数倍(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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.16 10:42:29