条件运算符
1 |
|
- C++ 中唯一的三目运算符
- 只计算一个运算分量
- 如果
<exp2>, <exp3>
的值类型相同并且均为左值表达式,则该条件运算符表达式为左值表达式 - 注意运算优先级:就近原则
switch
的编译优化
case
标签
使用整形常量表达式(即对于编译器固定),值不重复,次序任意:
- 字面常量:5
const
定义的常量enum
定义的常量define
定义的常量
switch 的表驱动
- L1:用寄存器
%eax
保存参数的值 - L2 - L4:vt 先减去最小的枚举值(节省跳转表的空间),再与最大枚举值和最小枚举值的差比较,如果 vt 大于此差值,返回 nullptr
- L5:访问跳转表,0x56557034 是其基地址
- L6:跳到对应的位置执行
switch 的其他实现
如果 range 的范围很大,表占用空间过大,采用其他方式实现:
实验结论(实验条件:GCC 7.5.0 ,-m32 -O0 ):
- case 数 < 4 :cmp
- case 数 = 4 :Tree
- case 数 > 4 :
- Range > 50 : Tree
- Range < 50 : Jump Table