gpt4 book ai didi

C++,静态局部变量(方法)与全局(文件)变量有什么区别?

转载 作者:行者123 更新时间:2023-11-30 01:13:42 25 4
gpt4 key购买 nike

  1. 局部static 变量被创建一次,方法将超出范围,但static 变量没有被销毁,它将一直存在于内存中直到程序结束.
  2. 一个全局的static变量在程序结束前一直存在于内存中。

那么局部和全局static变量有什么区别呢?

我们什么时候应该使用局部static 变量和全局static 变量?

最佳答案

其他答案已经告诉您局部静态对象(函数局部)和非局部静态对象(声明为全局或在函数中的静态对象)之间的区别命名空间);但是,您还应该了解使用其中一种的重要性。

我这里使用的信息来自Effective C++ Third Edition by Scott Myers (推荐的优秀读物)

A static object is one that exists from the time it's constructed until the end of the program.

正如其他人所提到的,非局部静态对象是在 main 之前构造的,而局部静态对象是在第一次构造函数被调用。

但是,如果您有两个静态对象并且一个依赖另一个,会怎样呢?你怎么能确定一个会先于另一个 build ? 你不能:在不同翻译单元中定义的非本地静态对象的相对初始化顺序未定义

Scott Myers 对翻译单元的定义(来自上述书籍):

A translation unit is the source code giving rise to a single object file. It's basically a single source file, plus all of the #include files.

所以假设您在单独的源文件中有这两个非本地静态对象,您不能保证一个会在另一个之前构造。这就是本地静态对象占优势的地方!

考虑 Scott Myers 的 FileSystem 类和 Directory 类示例,其中 Directory 依赖于 FileSystem:

class FileSystem
{
public:
size_t numDisks() const;
};
extern FileSystem tfs;

class Directory
{
public:
Directory()
{
size_t disks = tfs.numDisks();
...
}
};

如果 DirectoryFileSystem 之前构建,那么您将使用未初始化的类!幸运的是,您可以通过使用本地静态对象来解决这个问题!

class FileSystem
{
public:
size_t numDisks() const;
};
FileSystem& tfs()
{
static FileSystem fs;
return fs;
}

现在构造Directory时,即使是在FileSystem之前构造FileSystem也保证是在使用之前构建!

关于C++,静态局部变量(方法)与全局(文件)变量有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31578571/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com