2. 静态存储周期 (static storage duration)

2. 静态存储周期 (static storage duration)#

说明#

对于静态存储周期的对象, 它在第一次从运行到它的定义时被构造, 在 程序结束时 销毁. 因此即使多次运行到, 也只会构造一次.

 1void function() {
 2  static Noisy c1{Info{.ctor = "0", .dtor = "1"}};
 3  Noisy c2{Info{.ctor = "2", .dtor = "3"}};
 4}
 5
 6int main() {
 7  function();
 8  function();
 9}
10// 最终输出
11// 0: 第一次调用时, c1 构造
12// 2: 第一次调用时, c2 构造
13// 3: 第一次调用时, c2 析构
14// 2: 第二次调用时, c2 构造
15// 3: 第二次调用时, c2 析构
16// 1: 程序结束时, c1 析构

程序在执行完 main 函数后, 才对静态存储周期对象进行销毁. 因此, 它的析构晚于 main 函数中的自动存储周期对象.

1int main() {
2  Noisy c1{Info{.ctor = "0", .dtor = "1"}};
3  static Noisy c2{Info{.ctor = "2", .dtor = "3"}};
4}
5// 最终输出
6// 0: c1 构造
7// 2: c2 构造
8// 1: c1 析构
9// 3: c2 析构

如果有多个静态存储周期对象要销毁, 它们将按构造的相反顺序销毁.

1int main() {
2  { static Noisy c1{Info{.ctor = "0", .dtor = "1"}}; }
3  static Noisy c2{Info{.ctor = "2", .dtor = "3"}};
4}
5// 最终输出
6// 0: c1 构造
7// 2: c2 构造
8// 3: c2 析构
9// 1: c1 析构

全局变量也是静态存储周期, 它在程序开始、进入 main 函数之前被构造, 在程序结束时被销毁.

 1Noisy c1{Info{.ctor = "0", .dtor = "1"}};
 2
 3int main() {
 4  Noisy c2{Info{.ctor = "2", .dtor = "3"}};
 5}
 6// 最终输出
 7// 0: 程序开始时, c1 构造
 8// 2: c2 构造
 9// 3: c2 析构
10// 1: 程序结束时, c1 析构

类模板、函数模板实例化后可能是不同的类、函数, 则有不同的静态局部变量.

 1template <typename T>
 2void function() {
 3  static Noisy c1{Info{.ctor = "0", .dtor = "1"}};
 4}
 5
 6int main() {
 7  function<int>();
 8  function<double>();
 9  function<int>();
10}
11// 最终输出
12// 0: function<int>::c1 构造
13// 0: function<double>::c1 构造
14// 1: function<double>::c1 析构
15// 1: function<int>::c1 析构

题目#

题 1#

1int main() {
2  static Noisy c1{Info{.ctor = "v", .dtor = "r"}};
3  {
4    static Noisy c2{Info{.ctor = "e", .dtor = "o"}};
5  }
6  static Noisy c3{Info{.ctor = "c", .dtor = "t"}};
7}

题 2#

 1void function(Noisy const& noisy) {
 2  static Noisy c1 = noisy;
 3}
 4
 5Noisy c1{Info{.ctor = "d", .copy_ctor = "m", .dtor = "r"}};
 6
 7int main() {
 8  {
 9    static Noisy c2{Info{.ctor = "o", .copy_ctor = "l", .dtor = "o"}};
10    function(c1);
11    {
12      static Noisy c3{Info{.ctor = "a", .dtor = "r"}};
13    }
14    static Noisy c4{Info{.ctor = "i", .dtor = "e"}};
15    function(c2);
16  }
17
18  static Noisy c6{Info{.ctor = "n", .dtor = "_"}};
19}

题 3#

 1int main() {
 2  {
 3    {
 4      static Noisy c1{Info{.ctor = "i", .dtor = "t"}};
 5    }
 6    static Noisy c2{Info{.ctor = "n", .dtor = "n"}};
 7  }
 8  {
 9    {
10      static Noisy c3{Info{.ctor = "v", .dtor = "e"}};
11    }
12
13    static Noisy c4{Info{.ctor = "a", .dtor = "m"}};
14    {
15      static Noisy c5{Info{.ctor = "l", .dtor = "u"}};
16      {
17        static Noisy c6{Info{.ctor = "i", .dtor = "g"}};
18      }
19      static Noisy c7{Info{.ctor = "d", .dtor = "r"}};
20    }
21    static Noisy c8{Info{.ctor = "_", .dtor = "a"}};
22  }
23}