1

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

4

1 回答 1

1

我可以检查编译器本身正在优化的代码部分吗?

所有代码都由编译器优化,即受优化标志的影响,除了

  1. 它是从库 ( libgcc.a, libc.a, libm.a, lib<device>.a) 中拖出的代码。

  2. 启动代码crt<device>.o(当您更改其中的标志时,后者可能发生在 Makefile 中:如果模块不依赖于 Makefile 本身,make则不会重建它们。

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

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

为了确定这是否有效,您可以分别:

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

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

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

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

    /* #APP */
    ;  <line> "<compilation-unit>"
        <inline-asm-code>
    /* #NOAPP */
    
于 2020-02-17T11:39:24.580 回答