C union 关键字
nxdong July 30, 2022 [cpp] #cppC union 关键字的一些用法
基本原则
- union中可以定义多个成员,union的大小由最大的成员的大小决定。
- union成员共享同一块大小的内存,一次只能使用其中的一个成员。
- 对某一个成员赋值,会覆盖其他成员的值
- 联合体union的存放顺序是所有成员都从低地址开始存放的。
代码
union.c 文件如下:
typedef union
MyUnion;
void
int
编译运行
附注
sizeof((MyUnion){{0}}).f
的操作会不会有性能损失?
不会。sizeof 是编译期间求值的。
The operator sizeof produces the required memory storage space of its operand when the code is compiled
参考: https://en.wikipedia.org/wiki/Sizeof
union2.c 如下
typedef union
MyUnion;
int
编译对应的汇编代码:
gcc -S -masm=intel union2.c -o union2.s
union2.s的内容如下:
.file "union2.c"
.intel_syntax noprefix
.text
.globl main
.type main, @function
main:
.LFB0:
.cfi_startproc
push rbp
.cfi_def_cfa_offset 16
.cfi_offset 6, -16
mov rbp, rsp
.cfi_def_cfa_register 6
mov DWORD PTR -20[rbp], edi
mov QWORD PTR -32[rbp], rsi
mov DWORD PTR -16[rbp], 3
mov DWORD PTR -12[rbp], 4
mov DWORD PTR -8[rbp], 4
mov DWORD PTR -4[rbp], 4
mov eax, 0
pop rbp
.cfi_def_cfa 7, 8
ret
.cfi_endproc
.LFE0:
.size main, .-main
.ident "GCC: (GNU) 11.1.0"
.section .note.GNU-stack,"",@progbits
可以观察到汇编代码中是常量。
也可以通过[godbolt](https://godbolt.org/) 在线观察汇编对应情况