C存储类

  存储类定义C程序中变量/函数的范围(可见性)和生命周期。这些说明符放置在它们所修饰的类型之前。下面列出C程序中可用的存储类:

  auto

  register

  static

  extern

 

  auto存储类

  auto存储类是所有局部变量默认的存储类。

{
    int mount;
    auto int month;
}

  上面的实例定义了两个带相同存储类的变量,auto只能用在函数内,即auto只能修饰局部变量。

  

  register存储类

  register存储类用于定义存储在寄存器中而不是RAM中的局部变量。这意味着变量的自大尺寸等于寄存器的大小(通常是一个词),且不能对它应用一元的‘&’运算符(因为它们没有内存位置)。

  

{
    register int miles;
}

  

  static存储类

  static存储类指示编译器在程序的生命周期内保持局部变量的存在,而不需要在每次它进入和离开作用域时进行创建和销毁。一次,使用static修饰局部变量可以在函数调用之间保持局部变量的值。

  static修饰符也可以应用与全局变量。当static修饰全局变量时,会使变量的作用域限制在声明它的文件内。

  全局声明的一个static变量或方法可以被人和函数或方法调用,只要这些方法出现在跟static变量或方法同一个文件中。

  

#include <stdio.h>
/*函数声明*/
void func1(void); /*全局变量 - static时默认的 */
int main()
{
   while (count --){
     func1();
    }
    return 0;
}
void func1(void)
{
  /* 'thingy' 时 ‘func1’的局部变量 - 只初始化一次
  * 每次调用函数 ‘func1’  'thingy' 只不会被重置。
  */
  static int thingy = 5;
  thingy++;
  printf("thingy 为%d, count 为 %d\n",thingy,count);  

}

  extern存储类

  extern存储类用于提供一个全局变量的引用,全局变量对所有的程序文件都是可见的。当使用extern时,对于无法初始话的变量,会发变量指向一个之前定义过的存储位置。

   

  mutable存储类

  mutable说明符仅适用与类的对象,这将在本教程的最后进行讲解。

可以通过const成员函数修改。

  thread_local存储类

  使用thread_local说明符声明的变量仅可在他在其上创建的线程上放问。变量在创建线程适创建,并在销毁线程适销毁。每个线程都有其自己的变量副本。

  thread_local说明符可以与static或extern合并。

  可以将thread_local仅引用与数据声明和定义,thread_local不能用与函数声明或定义。

thread_local int x; //命名空间下的全局变量
class X
{
     static thread_local std::string s; //类的static成员变量  
};
static thread_local std::string X::s;  //X::s适需要定义的

void foo()
{
      thread_local std::vector<int> v; //本地变量
}

  

 

posted @ 2021-01-04 13:00  King~~~  阅读(145)  评论(0编辑  收藏  举报