C++ 存储类

C++ 中的每个 变量 都有两个特性:类型和存储类别。

类型指定了变量可以存储的数据类型。例如:intfloatchar 等。

而存储类别控制着变量的两个不同属性:生命周期(决定变量可以存在多久)和作用域(决定程序的哪个部分可以访问它)。

根据变量的存储类别,它可以分为 4 种主要类型:


局部变量

在函数内部(在花括号之间的函数体中定义)定义的变量称为局部变量或自动变量。

它的作用域仅限于定义它的函数。简单来说,局部变量仅在函数内部存在并可被访问。

当函数退出时,局部变量的生命周期结束(被销毁)。


示例 1:局部变量

#include <iostream>
using namespace std;

void test();

int main() 
{
    // local variable to main()
    int var = 5;

    test();
    
    // illegal: var1 not declared inside main()
    var1 = 9;
}

void test()
{
    // local variable to test()
    int var1;
    var1 = 6;

    // illegal: var not declared inside test()
    cout << var;
}

变量 var 不能在 test() 中使用,而 var1 不能在 main() 函数中使用。

关键字 auto 以前也用于定义局部变量:auto int var;

但是,自 C++11 起,auto 具有了不同的含义,不应用于定义局部变量。


全局变量

如果一个变量在所有函数之外定义,那么它被称为全局变量。

全局变量的作用域是整个程序。这意味着,在声明之后,它可以被程序中的任何部分使用和修改。

同样,它的生命周期也只在程序结束时才结束。


示例 2:全局变量

#include <iostream>
using namespace std;

// Global variable declaration
int c = 12;

void test();

int main()
{
    ++c;

    // Outputs 13
    cout << c <<endl;
    test();

    return 0;
}

void test()
{
    ++c;

    // Outputs 14
    cout << c;
}

输出

13
14

在上面的程序中,c 是一个全局变量。

该变量在上面的程序中对 main()test() 函数都是可见的。


静态局部变量

关键字 static 用于指定静态变量。例如:

... .. ...
int main()
{
   static float a;
   ... .. ...
}

静态局部变量仅存在于声明它的函数内部(类似于局部变量),但其生命周期在函数被调用时开始,仅在程序结束时结束。

局部变量和静态变量的主要区别在于,静态变量的值会持续到程序结束。


示例 3:静态局部变量

#include <iostream>
using namespace std;

void test()
{
    // var is a static variable
    static int var = 0;
    ++var;

    cout << var << endl;
}

int main()
{
    
    test();
    test();

    return 0;
}

输出

1
2

在上面的程序中,test() 函数被调用了 2 次。

第一次调用时,变量 var 被声明为静态变量并初始化为 0。然后将 1 添加到 var 并显示在屏幕上。

当函数 test() 返回时,变量 var 仍然存在,因为它是一个静态变量。

第二次函数调用时,不会创建新的 var 变量。同一个 var 会增加 1,然后显示在屏幕上。

如果 var 没有被指定为静态变量,上述程序的输出

1
1

寄存器变量(C++11 已弃用)

关键字 register 用于指定寄存器变量。

寄存器变量与自动变量类似,仅存在于特定函数内。它们被认为比局部变量更快。

如果程序遇到寄存器变量,它会尽可能将变量存储在处理器寄存器中,而不是内存中。这使得它比局部变量更快。

然而,此关键字在 C++11 中已被弃用,不应使用。


线程局部存储

线程局部存储是一种机制,通过该机制分配变量,使得每个存在的线程都有一个该变量的实例。

关键字 thread_local 用于此目的。

了解更多关于 线程局部存储 的信息。

你觉得这篇文章有帮助吗?

我们的高级学习平台,凭借十多年的经验和数千条反馈创建。

以前所未有的方式学习和提高您的编程技能。

试用 Programiz PRO
  • 交互式课程
  • 证书
  • AI 帮助
  • 2000+ 挑战