最近搞一个串口烧code的东西,搞了半天经常莫名其妙的出错,改了不相关的code都会影响!发现是编译器优化的问题,makefile里default的编译选项是-Os。。。只见过-O0 -O1 -O2 -O3,从来没见过-Os。。。以后遇到莫名其妙的问题的时候~如果不知道具体是哪个变量引起的(volatile可以解决)时候~就把整体编译优化选项降低~~也许会有意想不到的收获~~~
下面是gcc的man手册
-O
-O1 优化. 对于 大函数, 优化编译 占用 稍微多 的 时间 和 相当大 的 内存.
不使用 ‘-O’ 选项 时, 编译器 的 目标 是 减少 编译 的 开销, 使 编译结果 能够 调试. 语句 是 独立的: 如果 在 两
条语句 之间 用 断点 中止 程序, 你 可以 对任何 变量 重新 赋值, 或者 在 函数体 内 把 程序计数器 指到 其他语句,
以及 从 源程序 中 精确地 获取 你 期待 的 结果.
不 使用 ‘-O’ 选项 时, 只有 声明了 register 的 变量 才 分配使用 寄存器. 编译结果 比 不用 ‘-O’ 选项 的 PCC 要
略逊一筹.
使用了 ‘-O’ 选项, 编译器 会试图 减少 目标码 的 大小 和 执行时间.
如果 指定了 ‘-O’ 选项, ‘-fthread-jumps’ 和 ‘-fdefer-pop’ 选项 将被 打开. 在 有 delay slot 的 机器 上, ‘-fde‐
layed-branch’ 选 项 将 被 打 开. 在 即 使 没 有 帧 指针 (frame pointer) 也支持 调试的 机器 上,
‘-fomit-frame-pointer’ 选项 将被 打开. 某些机器 上 还可能会 打开 其他选项.
-O2 多优化一些. 除了 涉及 空间 和 速度 交换 的 优化选项, 执行 几乎 所有的优化工作. 例如 不进行 循环 展 开 (loop
unrolling) 和 函数内嵌 (inlining). 和 -O 选项 比较, 这个选项 既增加了 编译时间, 也提高了 生成代码 的 运行效
果.
-O3 优化的更多. 除了 打开 -O2 所做的 一切, 它 还 打开 了 -finline-functions 选项.
-O0 不优化.
阅读(4343) | 评论(0) | 转发(0) |