编译器为 atmel studio 优化 C 代码

C code Optimization by compiler for atmel studio

我使用的是 Atmel Studio 7,优化级别是 -O1。 我可以检查编译器本身正在优化代码的哪一部分吗? 如果我禁用优化,我的二进制文件大小为 12KB,使用优化级别 -O1 时,二进制文件大小为 5.5KB。

Can I check what portion of code is being optimized by the compiler itself?

全部 代码由编译器优化,即受优化标志影响,除了

  1. 是从库(libgcc.alibc.alibm.alib<device>.a)中拖来的代码。

  2. 启动代码 (crt<device>.o),其中还包括矢量 table,或者来自其他对象的代码,这些对象已经存在并且在当前编译中没有(重新)编译.当您更改其中的标志时,后者可能会发生在 Makefile 中:如果模块不依赖于 Makefile 本身,make 将不会重建它们。

  3. 来自汇编模块(*.S*.sx*.s)的代码,前提是预处理的汇编代码不使用 #ifdef __OPTIMIZE__ 的条件汇编或类似的。

  4. 内联汇编中的代码,前提是内联汇编没有被优化掉。

为了判断这是否生效,您可以分别:

  1. Link 和 -Wl,-Map,file.map 并检查该地图文件(文本文件)。它将列出由于未定义的符号而从何处拖动了哪些对象。

  2. 启动代码是 linked,除了你 -nostartfiles。将 -Wl,-v 添加到 link 阶段,您将看到 crt<device>.o 被 linked。

  3. 你知道你的编译单元,汇编模块,不是吗?

  4. 编译添加-save-temps。内联 asm 将在中间 *.s 文件中显示为

    /* #APP */
    ;  <line> "<compilation-unit>"
        <inline-asm-code>
    /* #NOAPP */