//register.cpp #include <stdio.h> #include <time.h> #include <Windows.h> int main1() { for(register int i=0;i<10;i++) { //由于register变量使用的是硬件CPU中的寄存器,寄存器变量无地址,所以不能使用取地址运算符"&"求寄存器变量的地址。 printf("%d\n",&i); } printf("\n"); return 0; } int main2() { register int i=0; //int* a=&i; //c语言不能取寄存器地址。 printf("%x",&i);//C++中寄存器变量在内存中存在副本。这里打印副本地址。 getchar(); return 0; } //寄存器变量用于频繁使用的变量,提升速度。 //由于受硬件寄存器长度的限制,所以寄存器变量只能是char、int或指针型。寄存器说明符只能用于说明函数中的变量和函数中的形参,因此不允许将外部变量或静态变量说明为"register"。 int main() { time_t start,end; time(&start); //寄存器变量,在cpu中执行速度飞快 //VC会自动优化为寄存器变量. gcc 不会。 register double res=0.0; register int i=0; // double res=0.0; //int i=0; for(i=0;i<300000000;i++) { res+=i; } printf("res=%f\n",res); time(&end); //printf("take time=%fs\n",(unsigned int)(end-start)); printf("take time=%fs\n",difftime(end,start)); return 0; }
//volatile.c #include <stdio.h> //volatile 的作用是:作为指令关键字,确保本条指令不会因编译器的优化而省略,且要求每次直接读值. //volatile告诉编译器每次都去内存中获取数据,而不是使用保存在寄存器里的备份(不要优化掉)。 //volatile因为每次都去获取数据,则可能被意想不到地改变 int main2(int argc, char *argv[]) { //release模式直接优化为寄存器变量,秒出 for(int i=0;i<999999999;i++) { } printf("Hello World!\n"); return 0; } int main(int argc, char *argv[]) { //volatile禁止优化,每次读内存 for(volatile int i=0;i<999999999;i++) { } printf("Hello World!\n"); return 0; }