「C语言」寄存器变量与内存变量

参考链接:

寄存器变量是什么?及它的存储种类有哪些?

静态变量、自动变量与寄存器变量的存储

寄存器变量-百度百科

前两天看师兄给的C语言的一本小册子,看到:

内存变量或寄存器变量是指进程运行过程中的变量是在内存中还是在寄存器中的变量。

以前学的时候从来没有注意过,内存变量和寄存器变量指的是什么呢?这里和语言中声明的全局变量、局部变量都不是很一样,这里对自己搜集的资料进行一个梳理。

来自百度百科

寄存器变量主要指C语言\C++语言定义的不是保存在内存上,而是直接存储在CPU中的寄存器中。

内存变量指存储在内存的存储单元中的变量,但是如果一个变量在程序中频繁使用,比如循环使用,就需要对内存多次进行访问,这样会影响程序的执行效率。

一般的定义格式为:

int main()
{
  register int temp;
}

由于寄存器的限制,所以寄存器的数目一般被限制起来,一旦超过限定的数目,C程序会自动将寄存器变量转换成普通的变量。而且寄存器的长度一般比较小,所以一般只存储char、int或者指针类型。一般只用于函数中的变量或者形参,而不允许用于外部变量或静态变量。

register最常用的就是作为循环控制变量等需要高速运行的场合。

查看以下程序,可以看出时间区别:

#include 
#include 

int registertest();
int withouttest();

int main()
{
    registertest();

    withouttest();
}

int registertest()
{
    clock_t start, finish;
    double time;
    start = clock();

    register int temp, i;
    for(i=0;i<30000;i++);
    for(temp=0;temp<=100;temp++);
    finish=clock();
    time = (double)(finish-start);

    printf("使用register花费时间:%lf\n", time);
    return 0;
}

int withouttest()
{
    clock_t start, finish;
    double time;
    start = clock();

    int temp, i;
    for(i=0;i<30000;i++);
    for(temp=0;temp<=100;temp++);
    finish=clock();
    time = (double)(finish-start);

    printf("不使用register花费时间:%lf\n", time);
    return 0;
}

运行结果为:

macdeMac:Test mac$ gcc registertest.c -o registertest 
macdeMac:Test mac$ ./registertest 
使用register花费时间:60.000000
不使用register花费时间:63.000000
macdeMac:Test mac$ ./registertest 
使用register花费时间:63.000000
不使用register花费时间:68.000000

可以看到时间是缩短了的。

另外需要注意的是,寄存器变量不存在地址,是存储在硬件CPU中的,所以不可以用&来取地址。

你可能感兴趣的:(编程语言)