const
const是代表一个不能改变的值的
volatile
代表变量是一个可能被CPU指令之外的地方改变的
e.g.
#include <stdio.h>
int main()
{
int i = 10;
i = i+20;
i = i+30;
printf("%d\n",i);
return 0;
}
如果是这样写的代码,那么编译器会觉得你很智障,它会自动把你的代码进行优化,它会
优化成i= i+50;因为CPU通过电路来控制内存,但是如果有块内存,有外部设备也可以对它进行修改
如下图代码:
#include <stdio.h>
int main()
{
volatile int i = 100;
int i = 100;
//如果这个时候外部设备改了i的值。那么这个时候后面的i就不再是以前的值
i = i +5;
i = i +10;
i = i +30;
printf("%d\n",i);
return 0;
}
所以volatile的意义就是:告诉编译器别自作聪明的给我把这些变量进行优化,因为这样写有用的有意义的,所以这时候编译器就会乖乖的一步一步进行编译。
register:
e.g
_asm
{
mov i, 100
mov eax, i
add eax, 50
mov eax, i
add eax, 20
mov i,eax
}
这段汇编语言看起来非常复杂,经过优化的话,就可以变成这样
_asm
{
mov i, 100
add eax, i
add eax,20
mov i, eax
}
但是对于CPU来讲:所有的计算工作都是在寄存器里面完成的,不能直接对内存的数进行运算的,它只能把内存里面的数拿到 寄存器里面算完,在退回去内存,它不能直接在内存里面算的
register int i;//变量i不是在内存里面,变量i就是在CPU的寄存器里面,
那么这就更加优化了
-asm
{
mov eax, 100
add eax, 50
add eax, 20
}
但是regist是建议型的命令,而不是命令型的指令
建议型:因为对于C语言来讲,寄存器是有限的,万一没有寄存器可用了,那么它就会忽略这些优化,但是有寄存器的话就一定会对你的代码进行优化。