那么本地和全局静态变量有什么区别?
何时必须使用局部静态变量和全局静态变量?
答案 0 :(得分:2)
其他人所说的补充:
范围和生命周期是两回事。
静态变量的生命周期=程序的生命周期,这就是static variable is not destroyed and it will live in memory until program got end.
When we have to use local static variable and global static variable?
local static
global static
。 例如: - 包含组织的Budget
的变量,对于所有部门都是相同的 希望这会有所帮助。感谢
答案 1 :(得分:2)
其他答案告诉您本地静态对象(函数本地)和非本地静态对象之间的区别(静态对象声明为全局或在命名空间);但是,你也应该理解使用一个而不是另一个的重要性。
我在这里使用的信息来自Effective C++ Third Edition by Scott Myers(推荐和优秀阅读)
静态对象是从构造到程序结束时存在的对象。
正如其他人所提到的,在main
之前构造非本地静态对象,而在第一次调用函数时构造本地静态对象
但是如果你有两个静态对象而另一个依赖另一个静态对象怎么办?你怎么能确定一个人会在另一个之前建造? 您无法:在不同翻译单元中定义的非本地静态对象的初始化的相对顺序未定义
Scott Myers对翻译单元的定义(来自上述书):
翻译单元是产生单个目标文件的源代码。它基本上是一个源文件,加上所有#include文件。
因此,假设您将这两个非本地静态对象放在不同的源文件中,您无法保证在另一个之前构造一个非本地静态对象。这是本地静态对象占上风的地方!
考虑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();
...
}
};
如果在Directory
之前构建FileSystem
,那么您将使用未初始化的类!幸运的是,你可以通过使用本地静态对象来解决这个问题!
class FileSystem
{
public:
size_t numDisks() const;
};
FileSystem& tfs()
{
static FileSystem fs;
return fs;
}
现在构建Directory
时,即使在FileSystem
之前构建它,FileSystem
也可以保证在{&1}}之前构建使用了!
答案 2 :(得分:1)
我能想到的差异:
变量的范围。全局静态变量对整个程序可见。函数静态变量仅在函数中可见。
初始化。在执行main
之前初始化全局变量。第一次调用函数时,函数静态变量被初始化。
答案 3 :(得分:0)
其他范围可以访问并可能更改全局静态变量。例如,两个函数可以使用全局静态变量共享状态。本地静态变量就是:local。其他功能无法直接看到。
全局静态变量可能被其他函数更改的事实是它们如此危险的主要原因。程序员经常对变量做出无根据的假设。例如,如果方法使用但不修改全局静态变量,则值仍可能从方法的开头更改为结束。然而,人们倾向于认为价值是不变的。
答案 4 :(得分:0)
本地静态仅在函数内可见。这允许名称保密。这可以用于实现分析逻辑,其中跟踪每个函数的调用次数。
本地静态的更重要的好处是构建它的时间点。在调用main之前构造全局数据。对于程序中的每个C ++文件,这发生在文件顶部到文件底部,但构造中的文件顺序未定义。本地静态仅在第一次被调用时被构造(C ++ 11仅保证一次,如果可以称为多线程,则早期C ++需要一些同步。)这意味着一个复杂的对象需要初始化程序的某些功能(例如,某些数据库)然后可以控制这个,因为你可以在调用包含这些静态变量的函数之前在main中执行初始化。
答案 5 :(得分:0)
本地静态仅在函数内部可见,它仅具有函数级别的范围,而Global Static具有程序范围。初始化,global在main
之前初始化,本地静态将在第一次调用函数时初始化。
全局静态变量如果使用不当可能会导致问题,因为在大型程序中很难跟踪正在改变它的值。
另一个可能的缺点可能是链接,如果您使用名为varnew
的全局静态变量并且您正在使用也具有相同变量的外部库,该怎么办。
始终建议限制变量的范围以避免不必要的错误。