编译器为 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?
全部 代码由编译器优化,即受优化标志影响,除了
是从库(libgcc.a
、libc.a
、libm.a
、lib<device>.a
)中拖来的代码。
启动代码 (crt<device>.o
),其中还包括矢量 table,或者来自其他对象的代码,这些对象已经存在并且在当前编译中没有(重新)编译.当您更改其中的标志时,后者可能会发生在 Makefile 中:如果模块不依赖于 Makefile 本身,make
将不会重建它们。
来自汇编模块(*.S
、*.sx
、*.s
)的代码,前提是预处理的汇编代码不使用 #ifdef __OPTIMIZE__
的条件汇编或类似的。
内联汇编中的代码,前提是内联汇编没有被优化掉。
为了判断这是否生效,您可以分别:
Link 和 -Wl,-Map,file.map
并检查该地图文件(文本文件)。它将列出由于未定义的符号而从何处拖动了哪些对象。
启动代码是 linked,除了你 -nostartfiles
。将 -Wl,-v
添加到 link 阶段,您将看到 crt<device>.o
被 linked。
你知道你的编译单元,汇编模块,不是吗?
编译添加-save-temps
。内联 asm 将在中间 *.s
文件中显示为
/* #APP */
; <line> "<compilation-unit>"
<inline-asm-code>
/* #NOAPP */
我使用的是 Atmel Studio 7,优化级别是 -O1。 我可以检查编译器本身正在优化代码的哪一部分吗? 如果我禁用优化,我的二进制文件大小为 12KB,使用优化级别 -O1 时,二进制文件大小为 5.5KB。
Can I check what portion of code is being optimized by the compiler itself?
全部 代码由编译器优化,即受优化标志影响,除了
是从库(
libgcc.a
、libc.a
、libm.a
、lib<device>.a
)中拖来的代码。启动代码 (
crt<device>.o
),其中还包括矢量 table,或者来自其他对象的代码,这些对象已经存在并且在当前编译中没有(重新)编译.当您更改其中的标志时,后者可能会发生在 Makefile 中:如果模块不依赖于 Makefile 本身,make
将不会重建它们。来自汇编模块(
*.S
、*.sx
、*.s
)的代码,前提是预处理的汇编代码不使用#ifdef __OPTIMIZE__
的条件汇编或类似的。内联汇编中的代码,前提是内联汇编没有被优化掉。
为了判断这是否生效,您可以分别:
Link 和
-Wl,-Map,file.map
并检查该地图文件(文本文件)。它将列出由于未定义的符号而从何处拖动了哪些对象。启动代码是 linked,除了你
-nostartfiles
。将-Wl,-v
添加到 link 阶段,您将看到crt<device>.o
被 linked。你知道你的编译单元,汇编模块,不是吗?
编译添加
-save-temps
。内联 asm 将在中间*.s
文件中显示为/* #APP */ ; <line> "<compilation-unit>" <inline-asm-code> /* #NOAPP */