程序的结构和执行

程序的机器级表示

  • 使用基于条件的数据传送替代基于条件的控制转移

    // 基于条件的数据传送
    int ntest = x >= y;
    if (ntest) {
    ...
    } else {
    ...
    }

    // 基于条件的控制转移
    if (x >y) {

    } else {

    }
  • while的两种汇编形式

    • jump to the middle

      	go to test;
      loop:
      body
      test:
      t = test-expr;
      if (t){
      goto loop;
      }
    • guarded-do

      t = test-expr;
      if(!t){
      goto done;
      }
      loop:
      body
      t = test-expr;
      if(t) {
      goto loop;
      }
      done:
  • 对抗缓冲区溢出攻击

    • 地址空间布局随机化:栈随机化,每次先在栈上随机分配一大块空间;程序每次加载地址不同
    • 栈破坏检测:在栈帧与栈状态间存放一个特殊的金丝雀
    • 限制可执行代码区域

优化程序性能

  • 优化编译器的能力和局限性
    • 确定两个指针是否指向不同的内存restrict关键字
    • 内联函数替换函数调用
  • 消除循环的低效率
    • 将某些定长的库函数结果移除循环
  • 减少过程调用
  • 消除不必要的内存引用
    • 使用临时变量替代指针
  • 循环展开
  • 提高程序并行性:可以考虑使用SIMD向量指令
  • 对dst和src地址相同的取值操作,造成写/读相关问题
    • 存储单元中存在存储缓冲区,每个缓存区由地址s_addr和数据s_data组成;srcdst不同时,数据和地址可以并行取出,如果相同,必须保证s_addrs_data前完成