//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;
}
转载请注明原文地址: https://ju.6miu.com/read-350224.html