何时使用 "Static" 进行持久性

When To Use "Static" For Persistence

本文关键字:持久性 Static 何时使      更新时间:2023-10-16

我知道静态可以为 c++ 中的东西提供持久性,但我对何时有必要感到困惑。

例如,如果我有一个函数:

const int get5(){
  int x = 5;
  return x;
}

我打印了回报,5自然会出现。但是,如果我尝试对数组进行相同的操作:

const int* getArray() {
    int arr[5];
    arr[0] = 5;
    arr[1] = 6;
    arr[2] = 7;
    arr[3] = 8;
    arr[4] = 9;
    return arr;
}

遍历数组的每个元素,我只是变得笨拙:

const int* ptr = getArray();
for (int index = 0; index < 5; index++) {
    cout << ptr[index] << endl;
}

结果:

5
19920968
257848734
258124688
258124688

但是,如果我用静态修饰符在 arr 前面,赋予它持久性,它可以工作:

5
6
7
8
9

我的问题是,为什么我需要将数组声明为静态才能使其值持久化,但在其他类型中,这不是必需的?谢谢!

不同之处在于,在第一个示例中,您返回一个副本,在第二个示例中,您返回一个指针。当您返回副本时,原始值是否被销毁并不重要。但是,当您返回指针时,必须确保指向对象的生存期超过函数的末尾,否则您将获得未定义的行为。

我的问题是,为什么我需要将数组声明为 static 才能使其值持久化,但在其他类型中,它不是必需的?

这是因为对于数组,返回指向

数组数据的指针,而对于其他类型,它是数据的副本。


在以下函数中:

const int* getArray() {
    int arr[5];
    ...
    return arr;
}

最后一个语句中表达式中的arr衰减为指向数组第一个元素的指针。函数getArray()返回此指针(而不是数组的副本(,该指针指向具有自动存储持续时间的数据。因此,在函数返回后,应不再访问该数据。

但是,如果将数组arr声明为 static ,即使您仍然返回指向数组第一个元素的指针,此数据在函数返回后仍然存在。

arr 是在本地范围内创建的,这意味着一旦函数返回,它就会被丢弃。它占用的内存(在这种情况下,它很可能驻留在寄存器中(然后被其他进程使用(如果使用寄存器,则由程序中的下一条指令使用(,这就是您看到奇怪值的原因。