EagleBear2002 的博客

这里必须根绝一切犹豫,这里任何怯懦都无济于事

C++ 高级程序设计-01-基本语法

条件运算符

1
<exp1> ? <exp2> : <exp3>
  1. C++ 中唯一的三目运算符
  2. 只计算一个运算分量
  3. 如果 <exp2>, <exp3> 的值类型相同并且均为左值表达式,则该条件运算符表达式为左值表达式
  4. 注意运算优先级:就近原则

switch 的编译优化

case 标签

使用整形常量表达式(即对于编译器固定),值不重复,次序任意:

  1. 字面常量:5
  2. const 定义的常量
  3. enum 定义的常量
  4. 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