我是这个领域的新手。以前我在做微控制器编程,我使用volatile变量来避免编译器优化。但我从未在变量声明之前看到过这样的易变声明。这是否意味着编译是在Arago构建中没有任何优化的情况下完成的。我有两个问题。
如何在编译期间启用不同类型的优化,例如Angstrom构建中的速度和空间优化?
如果它已经是优化编译,为什么我们不需要volatile声明?
答案 0 :(得分:2)
如果您使用gcc
进行编译,请添加/修改CFLAGS
-O2
或-O3
启用一系列通用性能优化。
Os
启用代码大小优化。
可以使用一长串控制单个gcc编译器优化选项的标志here。
大多数时候volatile
不是用于优化代码,而是用于ensure validity of data。
变量声明为volatile
告诉编译器可以在实现外部的任何时间修改变量
由于volatile限定变量的值可以随时更改,因此只要在代码中引用变量,就必须始终访问实际变量。
这意味着编译器无法对变量执行优化。标记变量volatile
会强制编译器生成忽略CPU寄存器中变量的代码,并实际读取映射到变量引用的地址的底层内存/硬件寄存器。
同时查看使用volatile
along-with compiler optimisations的各个方面。