c语言之volatile和register关键字

时间:2021-08-08 17:02:37
//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;
}