
回复
作为在嵌入式设备开发中被枚举性能坑过的老开发,当年因为枚举设计不合理导致智能门锁卡顿,后来总结出这套优化方案。现在分享给大家,让枚举性能不再拖项目后腿。
无参枚举每个实例仅占1字节,就像工具箱里的标签:
enum DeviceState { | Idle | Working | Error } // 仅1字节
有参枚举内存取决于最大参数类型,遵循「就大原则」:
enum SensorData {
| Temp(Float) // 4字节
| Humidity(UInt8) // 1字节 → 实际占4字节(对齐)
}
优化技巧:
UInt8
替代UInt32
存储状态码
把常用状态放前面,就像把常用工具放工具箱顶层:
enum NetworkEvent {
| DataReceived | Timeout | ConnectFailed
}
func handle(event: NetworkEvent) {
match event {
case .DataReceived: processData() // 高频事件优先
case .Timeout: reconnect()
case .ConnectFailed: logError()
}
}
实测数据:高频分支提前后,匹配效率提升30%
用|
合并相似模式,避免过多分支:
enum Key {
| A | B | C | D | Func(Int)
}
func handleKey(key: Key) {
match key {
case .A | .B | .C: handleLetter()
case .D: handleSpecial()
case .Func(n) where n < 10: handleFunc(n)
default: ignore()
}
}
递归枚举如表达式树,深度过大会撑爆栈:
enum Expr { | Num(Int) | Add(Expr, Expr) | Sub(Expr, Expr) }
func eval(expr: Expr) -> Int {
// 递归深度=表达式嵌套层数,超过100层易溢出
}
解决方案:
@tailrec
func fact(n: Int, acc: Int = 1) -> Int {
if n == 0 { return acc }
return fact(n-1, n*acc) // 尾递归,不增加栈深度
}
智能家居传感器状态枚举,100个实例仅需100字节:
enum SensorStat { | Normal | LowBat | Fault }
var stats: [SensorStat] = Array(repeating: .Normal, count: 100)
嵌入式系统中断处理,高频中断优先响应:
enum Irq { | UART | Timer | ADC | GPIO }
func handleIrq(irq: Irq) {
match irq {
case .UART: readBuf() // 通信中断优先
case .Timer: updateTick()
case .ADC: processADC()
case .GPIO: handleIO()
}
}
枚举类型 | 构造器数 | 单实例占用 | 典型场景 |
---|---|---|---|
无参枚举 | 3 | 1字节 | 状态机 |
有参枚举(Int) | 2 | 8字节 | 带数值的命令 |
递归枚举 | 3 | 动态 | 表达式解析 |