`
jakielong
  • 浏览: 229298 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

自动、静态、 寄存器、易失变量的区别

阅读更多

自动变量   什么是自动变量呢?自动变量就是指在函数内部定义使用的变量。他只是允许在定义他的函数内部使用它。在函数外的其他任何地方都不能使用的变量。自动变量是局部变量,即它的区域性是在定义他的函数内部有效。当然这说明自动变量也没有链接性,因为它也不允许其他的文件访问他。由于自动变量在定义他的函数的外面的任何地方都是不可见的,所以允许我们在这个函数外的其他地方或者是其他的函数内部定义同名的变量,他们之间不会发生冲突的。因为他们都有自己的区域性,而且它没有链接性(即:不允许其他的文件访问他的)。来看看自动量的持续性。计算机在执行这个函数的时候,创建并为它分配内存,当函数执行完毕返回后,自动变量就会被销毁。这个过程是通过一个堆栈的机制来实现的。为自动变量分配内存就压栈,而函数返回时就退栈。 

  /* auto */
  #include <stdio.h>
  int main()
  {
  int print();
  int var,i;
  for(i=0;i<=10;i++)
  var=print();
  printf("%d\n",var);
  return 0;
  }
  int print()
  {
  auto int i=0; /* 自动变量 */
  i+=1;
  printf("%d\n",i);
  return i;
  }
  /* end */

 
  静态变量:   静态变量与自动变量的本质区别是,静态变量并不像自动变量那样使用堆栈机制来使用内存。而是为静态变量分配固定的内存,在程序运行的整个过程中,它都会被保持,而不会被销毁。这就是说静态变量的持续性是程序运行的整个周期。这有利于我们共享一些数据。如果静态变量在函数内部定义,则它的作用域就是在这个函数内部,仅在这个函数内部使用它才有效,但是它不同于自动变量的,自动变量离开函数后就会被销毁,而静态变量不会被销毁。他在函数的整个运行周期内都会存在。在函数外面定义的变量为全局变量,工程内的所有文件都可以访问他,但是它在整个工程内只能定义一次,不能有重复的定义,不然就会发生错误,而其他的文件要想使用这个变量,必须用extern来声明这个变量,这个声明叫做引用声明。这一点很重要,如果你没有用extern 来声明在其他文件中已经定义的全局变量,就来使用它,就会发生错误如果你只是想在定义他的文件中使用它,而不允许在其他的文件中使用它,那么就用关键字 static来在函数外面声明变量。这样这个变量在其他文件中将不可见,即它的连接性而内部链接。有一点是我们值得注意的。像:如果你在函数外这样声明一个变量,const int a ; 变量a的连接性为内部链接,只能在定义他的文件内使用。还有如果你在定义静态变量的时候并没有给变量初始化,则静态变量将被自动初始化为0; 

  /* static */
  #include <stdio.h>
  int main()
  {
  int print();
  int var,i;
  for(i=0;i<=10;i++)
  var=print();
  printf("%d",var);
  return 0;
  }
  int print()
  {
  static int i; /*静态变量 */
  i+=1;
  printf("%d\n",i);
  return i;
  }
  /* end */

 
  寄存器变量:   在c语言当中可以使用寄存器变量来优化程序的性能,最常见的是在一个函数体当中,将一个常用的变量声明为寄存器变量: register int ra; 如果可能的话,编译器就会为它分配一个单独的寄存器,在整个函数执行期间对这个变量的操作全都是对这个寄存器进行操作,这时候就不用频繁地去访问内存了,自然就提高了性能.但是寄存器变量不是强制性的,也就是,即使你使用register关键字去声明一个变量为寄存器变量,编译器还是有可能把它作为一个普通的变量而不是寄存器变量来使用的. 在我们写程序的过程当中,有时候会经常用到一个全局变量,如果能够把它作为寄存器变量来使用,显然可以提高程序的性能,特别是对于那些对性能要求比较高的程序(比如模拟器,虚拟机等).拿X86平台来说,如果使用Gcc扩展,可以按照如下方式声明一个全局寄存器变量,并指定它存入ebx寄存器:int ra asm("ebx");用作这种用途的还有“ebp, ebx, esi, edi".这时候需要在编译程序的时候给出特别的选项,因为有些寄存器原本是另有用途的,比如ebp寄存器,原来是做frame-pointer用.

  易失变量:   volatile:(嵌入式程序员必须掌握的)volatile最初的意思是表示汽油容易挥发,在c中的作用大概有两点(1)表示变量是易失的,易变的. (2)强制访存操作,防止编译器去优化,告诉编译器每次必须去内存中取值,而不是从寄存器或者缓存.

分享到:
评论

相关推荐

    全局变量、局部变量、静态变量即内存管理

    变量类型是编程语言中非常重要的一个概念,全局变量、局部变量、静态变量都是程序员经常使用的变量类型,但是这些变量类型之间的区别和联系却经常让人感到困惑。今天我们将详细地探讨这些变量类型之间的区别和联系,...

    C++变量总结 说明各种变量

    C++提供了四种存储属性:自动变量、外部变量、静态变量和寄存器变量。自动变量是最常见的类型,通常在函数内部声明,其存储空间在栈上分配,并在函数调用结束时自动释放。外部变量则是在函数外部定义的,作用域覆盖...

    C语言中静态和全局的区别

    其中,全局变量和静态变量是两种常见的存储类型,它们在内存的存储位置、初始化和作用域方面存在一些区别。 首先,我们来了解一下C程序的内存布局。一个典型的C程序可以被划分为几个不同的部分,包括正文段、初始化...

    变量的存储类型、外部变量、static内部变量讲解

    - **定义**:寄存器变量是一种特殊的自动型变量,它存储在CPU的寄存器中而非内存中。 - **存储区域**:CPU的通用寄存器。使用`register`关键字声明,以减少对内存的访问次数,从而提高程序执行效率。 - **使用建议**...

    c_全局变量

    局部变量的存储类别可以是自动变量(auto)、寄存器变量(register)或静态变量(static)。 全局变量是指在函数外部定义的变量,它们的作用域是整个源程序文件。全局变量可以在任何函数中使用,但需要使用extern...

    单片机之静态局部变量static

    register变量是寄存器变量,用于高效的寄存器存储。 因此,静态局部变量是单片机编程中一个非常重要的概念,了解静态局部变量的特点和应用场景对编程非常重要。 在单片机开发中,静态局部变量可以应用于多种场景,...

    程序设计-变量的存储方式和生存期.pptx

    C语言中,变量的存储方式可以分为四种:自动存储、静态存储、寄存器存储和外部存储。 自动存储(auto)是C语言中使用最多的存储方式,也是系统默认的存储方式。自动存储的变量也可称为自动变量。自动存储的变量定义的...

    C++基础--变量的作用域和存储区

    在存储区方面,变量可以有以下几种类型:静态变量、自动变量、外部变量和寄存器变量。静态变量(用`static`关键字声明)的生命周期贯穿整个程序运行,即使在定义它的函数或块结束后仍保留其值。外部变量(在函数外部...

    C语言的变量PPT课件.pptx

    动态生存期的变量,如局部自动变量和寄存器变量,它们在运行时按需创建,使用完毕后立即销毁。动态生存期的变量存储在动态数据区,通常在函数调用时分配,调用结束时释放。 3.1.1 示例3-1展示了全程生存期和动态...

    局部变量 全局变量和存储分类 局部变量作用域和生存期PPT课件.pptx

    例如,auto 型变量是自动分配的,register 型变量是寄存器型的,static 型变量是静态型的,extern 型变量是外部型的。 在程序中,变量的存储类型和生存期非常重要。正确地选择变量的存储类型和生存期,可以提高程序...

    mips32位的32个寄存器组成的寄存器组

    3. **$2 (全局指针GP)**:在C程序中,它通常保存栈帧的基地址,用于访问全局和静态变量。 4. **$3 (框架寄存器FP)**:也称为堆栈指针,保存当前函数的栈帧地址,用于动态分配和访问局部变量。 5. **$4-$7 (可变...

    win32汇编寄存器的详细说明

    - **DS (Data Segment)**:数据段寄存器,用于指向数据段,数据段存放全局变量和静态变量。 - **SS (Stack Segment)**:栈段寄存器,用于指向栈段,栈段存放函数调用时的局部变量和函数参数等。 - **ES (Extra ...

    变量的存储方式

    - 寄存器变量(`register`关键字):这是一种优化策略,尝试将变量存储在CPU的寄存器中,以提高访问速度。但实际是否能存储在寄存器取决于编译器和可用资源,如果无法满足,编译器会自动降级为自动变量存储。 3. ...

    C语言中存储类(英文).pptx

    静态存储类的变量是指在函数外部定义的变量,存储在静态存储区中。这些变量在程序执行期间一直存在,不会被释放。静态存储类的变量可以在多个函数之间共享。 例如: ```c int x = 10; // 静态存储类变量 void func...

    局部变量 全局变量 堆栈总结

    #### 五、静态变量与非静态变量的区别 **非静态变量**: - 在函数体内部定义的局部变量是非静态的,每次函数调用都会重新创建并赋初值。 - 全局变量默认是非静态的,可以在整个程序中访问。 **静态变量**: - 在...

    变量的作用域与生存期PPT学习教案.pptx

    正确地使用局部、全局和静态变量,以及适当地利用寄存器变量,可以帮助优化程序性能,同时避免潜在的内存泄漏和数据冲突问题。在编程实践中,应根据需求选择合适的变量类型和存储类别,确保代码的可读性和可维护性。

    变量的存储小结

    C语言中,变量的存在期主要有两种:自动存储期和静态存储期。自动存储期的变量在程序进入其定义的代码块时创建,在退出代码块时销毁;而静态存储期的变量则在整个程序运行期间一直存在,不会随着作用域的退出而销毁...

    C语言、变量和函数的作用域与生存期

    4. 静态变量在程序开始时初始化,如果没有赋予初始值,会自动初始化为0。 理解并正确使用变量和函数的作用域以及生存期,对于编写高效、可维护的C语言程序至关重要。避免过度依赖全局变量,合理利用存储类型说明符...

    C语言初学者入门讲座 第十讲 函数(5)

    本文介绍了C语言中的静态局部变量、静态全局变量以及寄存器变量的概念和用法。静态局部变量和静态全局变量的区别主要在于作用域的不同:前者的作用域仅限于定义它的函数内部,后者的作用域仅限于定义它的源文件。而...

    08-变量类别与编译预处理-自己使用的C语言教程PPT-适合老师备课或者自学.pptx

    全局变量、局部变量、静态变量和寄存器变量各有其特点和用途,而编译预处理则提供了代码复用和文本替换的手段,增强了代码的可读性和效率。在实际编程中,应根据需求灵活运用这些概念,同时注意避免潜在的问题,如...

Global site tag (gtag.js) - Google Analytics