Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xslt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;,静态局部变量(方法)和全局(文件)变量之间的区别是什么? 本地静态变量创建一次,方法将超出范围,但静态变量不会被销毁,它将一直保存在内存中,直到程序结束 在程序结束之前,全局静态变量一直存在于内存中_C++_Static - Fatal编程技术网

C++ C++;,静态局部变量(方法)和全局(文件)变量之间的区别是什么? 本地静态变量创建一次,方法将超出范围,但静态变量不会被销毁,它将一直保存在内存中,直到程序结束 在程序结束之前,全局静态变量一直存在于内存中

C++ C++;,静态局部变量(方法)和全局(文件)变量之间的区别是什么? 本地静态变量创建一次,方法将超出范围,但静态变量不会被销毁,它将一直保存在内存中,直到程序结束 在程序结束之前,全局静态变量一直存在于内存中,c++,static,C++,Static,那么,局部变量和全局变量之间的区别是什么呢 我们什么时候应该使用局部静态变量和全局静态变量?全局静态变量可以通过其他作用域访问并可能更改。例如,两个函数可以使用全局静态变量共享状态。局部静态变量就是:局部变量。其他函数无法直接看到它 全局静态变量可能被其他函数更改这一事实是它们如此危险的主要原因。程序员经常对变量做出不必要的假设。例如,如果一个方法使用但不修改全局静态变量,则该值仍然可能从方法的开始更改到结束。然而,人们倾向于认为价值是不变的。我能想到的区别是: 变量的范围。全局静态变量对整个程

那么,局部变量和全局变量之间的区别是什么呢


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

全局静态变量可以通过其他作用域访问并可能更改。例如,两个函数可以使用全局静态变量共享状态。局部静态变量就是:局部变量。其他函数无法直接看到它


全局静态变量可能被其他函数更改这一事实是它们如此危险的主要原因。程序员经常对变量做出不必要的假设。例如,如果一个方法使用但不修改全局静态变量,则该值仍然可能从方法的开始更改到结束。然而,人们倾向于认为价值是不变的。

我能想到的区别是:

  • 变量的范围。全局静态变量对整个程序可见。函数静态变量仅在函数中可见

  • 初始化。在执行
    main
    之前初始化全局变量。函数静态变量在第一次调用函数时初始化


  • 只有在函数中才能看到局部静态。这允许对名称保密。这可用于实现分析逻辑,其中跟踪每个函数的调用数


    局部静态的更重要的好处是它被构造的时间点。在调用main之前构造全局数据。从程序的顶部到文件的底部,对于程序中的每个C++文件都是这样的,但是在构建中文件的顺序是未定义的。本地静态结构只在第一次调用时才被构建(C++ 11只保证一次,早期C++需要一些同步,如果它可以被称为多线程)。这意味着需要对程序进行初始化的复杂对象(例如一些数据库)。然后,这可以控制,因为在调用包含这些静态变量的函数之前,您可以在main中执行初始化。

    局部静态仅在函数内部可见,它仅具有函数级别的范围,而全局静态具有程序范围。初始化,全局在
    main
    之前初始化,本地静态将在第一次调用函数时初始化

    全局静态变量如果使用不当可能会导致问题,因为在大型程序中,很难跟踪其值的变化

    另一个可能的缺点可能是链接,如果您使用名为
    varnew
    的全局静态变量,并且您使用的外部库也具有相同的变量,该怎么办


    始终建议限制变量的范围以避免不必要的错误。

    其他人所说的补充:

    范围和生命周期是两件不同的事情

    静态变量的生存期=程序的生存期,这就是为什么
    静态变量不会被销毁,它将一直保存在内存中,直到程序结束。

  • 范围表示我们使用变量/使用变量的位置
  • 生存期另一方面,是程序的完整执行时间,在某些情况下,我们可能会终止程序,但在后台仍有位和段在运行
  • 何时必须使用局部静态变量和全局静态变量?

    • 当我们需要一个仅限于该函数的变量时,应该使用
      局部静态
    • 当我们需要程序中所有函数共用的变量时,我们应该使用
      全局静态
      。例如:-一个包含组织的
      预算
      的变量,它对所有部门都是相同的

    希望这有帮助。谢谢

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

    我在这里使用的信息来自(推荐的优秀读物)

    静态对象是一个从构建到程序结束都存在的对象

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

    但是如果你有两个静态对象,一个依赖另一个呢。你怎么能确定一个会比另一个先建造您不能:未定义在不同翻译单位中定义的非本地静态对象初始化的相对顺序

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

    翻译单元是产生单个目标文件的源代码。它基本上是一个源文件,加上所有的#include文件

    假设这两个非本地静态对象位于不同的源文件中,您无法保证一个会在另一个之前构建。这是局部静态对象占优势的地方

    以Scott Myers的
    文件系统
    类和
    目录
    类为例,其中
    目录
    依赖于
    文件系统

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

    如果
    目录
    文件系统
    之前构建,则t
    class Directory
    {
    public:
        Directory()
        {
            size_t disks = tfs.numDisks();
            ...
        }
    };
    
    class FileSystem
    {
    public:
        size_t numDisks() const;
    };
    FileSystem& tfs()
    {
        static FileSystem fs;
        return fs;
    }