***volatile在多线程用的最多。***
#include<stdio.h>
#include<stdlib.h> int main()
{
for(volatile int i = ; i < ; i++)
{ }
printf("天气真不错!");
}
1.可写内存是可以直接赋值,寄存器赋值,没有意义,cpu寄存器的刷新速度是很快的,赋值也许马上就被覆盖了,只有在内存中才能长久保存。
2.debug模式下,会执行到条件不满足时,而release模式下(加上volatile关键字就不会了),就秒出,debug模式中会执行一下,而release跳过。
- debug 调试模式
- release 商业发行模式,会自动优化。
2.空语句下,编译器自动优化,某些情况不是很听话
3.int = 0; 编译器会把它自动优化为寄存器变量,然后寄存器检测到他里边是空语句,就会自动跳过不去执行。
4.若想让它禁止优化,将 i 放在内存中,而不是cpu里的寄存器中。volatile
volatile强化
/*release模式,下面程序中如果不加wolatile,打印的结果会是10,10,若是加上了volatile就会变成10,32.*/ #include <stdio.h>
#inlcude <stdlib.h> int main()
{
volatile int i = ; //数据被意外改变的时候,强制读内存(如果不读内存,编译器会做一些优化,会让程序失误),
int a = i;
printf("\ni=%d", a);
_asm //属于汇编语言,改变i的值
{
move dword ptr[ebp-],20h //i等于10,相当于栈底,栈底的指针是ebp,h代表16进制
}
int b = i; //如果不加volatile,就是给a赋值时只读了一次内存中i的值,然后赋给a和b
print(\n=%d, b); getchar(); }