精华内容
下载资源
问答
  • 局部静态变量什么时候初始化
    千次阅读
    2019-09-28 23:11:52

    全局变量和静态(全局和局部)变量 什么时候初始化?

    本文链接:https://blog.csdn.net/sunny04/article/details/18605273

    1. 静态变量的初始化是在编译时进行,变量的赋值是在函数或程序运行时进行。
    2. 静态变量只初始化一次,但可以通过赋值的方式多次修改静态变量的值。
    3. 全局变量和静态变量 在进入 main 前被初始化

    更多相关内容
  • static Singleton *GetInstance() // 如果多次调用此函数,单例类的初始化也只会执行一次(即只会为这个静态局部对象分配一次内存空间) { static Singleton locla_s; return &locla_s; } templ.
    #include <iostream>
    
    using namespace std;
    
    // 基于C++11静态局部变量的懒汉式单例实现
    class Singleton
    {
    public:
      static Singleton *GetInstance() // 如果多次调用此函数,单例类的初始化也只会执行一次(即只会为这个静态局部对象分配一次内存空间)
      {
        static Singleton locla_s;
        return &locla_s;
      }
    
      template<typename T>
      T GetSquare(T number);
    private:
      int x_;
      int y_;
    
      static Singleton *local_instance;
      Singleton() : x_(10), y_(10) {
        cout << "构造" << endl;
      };
      ~Singleton() {
        cout << "析构" << endl;
      }
    };
    
    template<typename T>
    T Singleton::GetSquare(T number) {
      return number * number;
    }
    
    
    int main()
    {
      {
        cout << "first time to use single : " << endl;
        cout << Singleton::GetInstance()->GetSquare(10) << endl;
        cout << "end first use ...... " << endl;
      }
    
      {
        cout << "second time to use single : " << endl;
        cout << Singleton::GetInstance()->GetSquare(20) << endl;
        cout << "end second use ...... " << endl;
      }
      return 0;
    }

     

    C++11标准关于局部静态变量初始化,有这么几点要求:

    1. 变量在代码第一次执行到变量声明的地方时初始化。

    2. 初始化过程中发生异常的话视为未完成初始化,未完成初始化的话,需要下次有代码执行到相同位置时再次初始化。

    3. 在当前线程执行到需要初始化变量的地方时,如果有其他线程正在初始化该变量,则阻塞当前线程,直到初始化完成为止。

    4. 如果初始化过程中发生了对初始化的递归调用,则视为未定义行为。

    展开全文
  • c++全局变量和静态局部变量初始化的时间 1.全局变量初始化在主函数之前 2.静态局部变量初始化在第一次调用这个静态局部变量之前 #include <iostream> using namespace std; class A { public: A(int a):m_a...

    c++全局变量和静态局部变量初始化的时间

    1.全局变量初始化在主函数之前
    2.静态局部变量初始化在第一次调用这个静态局部变量之前

    #include <iostream>
    using namespace std;
    
    class A
    {
    public:
        A(int a):m_a(a){cout << "A(int a):" << m_a << endl;}
        ~A(){cout << "~A():" << m_a <<endl;}
    
    private:
        int m_a;
    };
    
    A a(10);
    
    void fun()
    {
        static A a(5);
    }
    
    int main()
    {
        cout << "--------------------------" << endl;
        fun();
        return 0;
    }
    
    

    编译结果为:
    在这里插入图片描述
    可以看到全局变量在调用主函数之前已经初始化了,静态局部变量在调用之前进行初始化。
    全部变量最后才被析构。

    展开全文
  • 静态变量的内存分配和初始化对于C语言的全局和静态变量,不管是否被初始化,其内存空间都是全局的;如果初始化,那么初始化发生在任何代码执行之前,属于编译期初始化。由于内置变量无须资源释放操作,仅需要回收...

    谢谢上面两位同学的回答,结合自己的查询和测试,整理了下最终的结果,在这里贴下,如果发现有不对的地方,还请各位指正,谢谢。

    静态变量的内存分配和初始化

    对于C语言的全局和静态变量,不管是否被初始化,其内存空间都是全局的;如果初始化,那么初始化发生在任何代码执行之前,属于编译期初始化。由于内置变量无须资源释放操作,仅需要回收内存空间,因此程序结束后全局内存空间被一起回收,不存在变量依赖问题,没有任何代码会再被执行!

    C++引入了对象,这给全局变量的管理带领新的麻烦。C++的对象必须有构造函数生成,并最终执行析构操作。由于构造和析构并非分配内存那么简单,可以说相当复杂,因此何时执行全局或静态对象(C++)的构造和析构呢?这需要执行相关代码,无法在编译期完成,因此C++标准规定:全局或静态对象当且仅当对象首次用到时才进行构造,并通过atexit()来管理对象的生命期,在程序结束之后(如调用exit,main),按FILO顺序调用相应的析构操作!

    总结:

    全局变量、文件域的静态变量和类的静态成员变量在main执行之前的静态初始化过程中分配内存并初始化;局部静态变量(一般为函数内的静态变量)在第一次使用时分配内存并初始化。这里的变量包含内置数据类型和自定义类型的对象。

    静态变量初始化的线程安全性说明

    非局部静态变量一般在main执行之前的静态初始化过程中分配内存并初始化,可以认为是线程安全的;

    局部静态变量在编译时,编译器的实现一般是在初始化语句之前设置一个局部静态变量的标识来判断是否已经初始化,运行的时候每次进行判断,如果需要初始化则执行初始化操作,否则不执行。这个过程本身不是线程安全的。

    C++11标准针规定了局部静态变量初始化需要保证线程安全,具体说明如下:

    If control enters the declaration concurrently while the variable is being initialized, the concurrent execution shall wait for completion of the initialization

    新的编译器大多对C++11的标准支持,因此也保证了这一点,但是C++03标准之前并无此说明,所以很多旧版本的编译器并不能完全支持。

    注:VS2008 测试多线程的条件下虽然只有一个线程执行一次初始化,但非初始化的线程并不会等待初始化结束,而是立即返回未正确初始化的静态对象。

    针对局部静态变量初始化的线程安全性,g++编译器的实现相当于使用了一个全局锁来控制一个局部静态变量的标识(标识用来判定是否已经初始化)。详情参考:http://www.cnblogs.com/xuxm2007/p/4652944.html

    使用相关:

    以前的标准都没有规定局部静态变量的初始化在并发模式下是否安全,很多旧版本的编译器并没有处理它的并发安全问题。因此在不支持C++11标准的编译环境下,多线程程序最好不要使用需要明显初始化的局部静态变量(对象),如果需要使用(比如单例模式中),则可以考虑使用一个全局锁或静态成员变量锁,最好不要使用局部静态变量锁,因为其本身存在一个构造的问题,多个线程获取实例的时候,可能会出现一个线程在进行锁对象构造,另一个线程则避开了构造,在锁对象还没有完全构造完成的情况下,就lock了,这个时候的行为能不能成功锁定取决于锁的实现了,虽然一般的实现不会出现问题但终归不是很严谨。

    展开全文
  • 编译器实际上做的是在内部生成单个类初始化例程,该例程将所有静态变量初始化器和所有静态初始化器代码块按它们在类声明中出现的顺序组合在一起.首次加载类时,此单个初始化过程仅自动运行一次. 对于内部类,它们不能...
  • 关于Java:何时初始化静态变量

    千次阅读 2021-03-16 14:11:38
    我想知道何时将静态变量初始化为其默认值。加载类时是否创建(分配)了静态var是否正确,然后执行静态初始化程序和声明中的初始化?在什么时候给出默认值? 这导致前向参考的问题。另外,如果您可以参考"为什么不及时...
  • C++中静态变量初始化时间

    千次阅读 2021-11-05 14:33:55
    本文表述了C++中静态变量初始化时机
  • 小编典典从请参阅Java静态变量方法:它是一个属于类而不属于对象(实例)的变量静态变量在执行开始时仅初始化一次。在初始化任何实例变量之前,将首先初始化这些变量该类的所有实例共享一个副本静态变量可以通过类名...
  • 即使局部静态变量定义时没有赋初值,系统会自动赋初值0(对数值型变量)或空字符(对字符变量);静态变量的初始值为0。4.当多次调用一个函数且要求在调用之间保留某些变量的值时,可考虑采用静态局部变量。虽然用...
  • 静态局部变量初始化

    千次阅读 2019-03-07 11:17:06
    原以为会每次调子函数时,都会初始化静态局部变量。实际并非如此 #include void key(void) { //static unsigned char key_up =1; unsigned char key_up =1; printf("key_up = %d \n", key_up); key_up = ...
  • 1、成员变量成员变量有默认初始值,而方法内的局部变量却没有初始值。...一、类的成员变量初始化 ---在JVM类加载阶段完成类的成员变量又分为静态成员变量和非静态成员变量。静态成员变量静态成员变量会被初...
  • 在函数体内定义了一个变量,每当程序运行到该语句时都会给该局部变量...静态局部变量在程序执行到该对象的声明处时被首次初始化,即以后的函数调用不再进行初始化(这一点非常的重要);静态局部变量一般在声明处初始化
  •  1、 已经初始化的全局变量存放与data数据段;未初始化的全局变量存放与bss数据段。  2、 静态的全局变量存放与data数据段  3、 局部变量存放在栈上。  4、 静态局部变量,并不是在调用函数时分配函数...
  • 本文实例讲述了C#中static静态变量的用法。分享给大家供大家参考。具体如下: 使用 static 修饰符声明属于类型本身而不是属于特定对象的静态成员static修饰符可用于类、字段、方法、属性、运算符、事件和构造函数,...
  • 本文主要介绍了C++中的局部变量、全局变量、局部静态变量、全局静态变量的区别。具有很好的参考价值,下面跟着小编一起来看下吧
  • 1. 静态变量初始化是在编译时进行,变量的赋值是在函数或程序运行时进行。 2. 静态变量初始化一次,但可以通过赋值的方式多次修改静态变量的值。 3. 全局变量和静态变量 在进入 main 前被初始化
  • 全局变量、文件域的静态...局部静态变量(一般为函数内的静态变量)在第一次使用时分配内存并初始化。这里的变量包含内置数据类型和自定义类型的对象。 class B{ public: B() { cout ; } ~B() { cout << "B
  • 没有初值是不是自动给它赋值(网上好像有这么讲的),那什么时候在内存开辟空间呢(这个图上的生存期从main函数就开始)? 这些可能涉及计算机组成原理,我没学过,希望哪位高手能详细解释下,万分感谢!!!
  • 静态属性:随类的存在而存在,是在类加载的初始化静态属性:随实例的属性存在而存在。 局部变量局部变量不能加static,包括protected, private, public这些也不能加。局部变量保存在栈中。 局部编程必须在...
  • 前几天,有个大佬考了我一个问题:为什么类的成员变量不需要指定值就可以自动赋予初始值,而方法内的局部变量就必须指定初始值呢?说实话,这个问题确实难倒我了,之后我在网上一顿操作,终于把这个问题弄得稍微明白...
  • C++11 静态 局部变量 初始化 线程安全
  • 什么时候初始化 根据 C++ 标准,全局变量初始化要在 main 函数执行前完成,常识无疑,但是这个说法有点含糊,main 函数执行前到底具体是什么时候呢?是编译时还是运行时?答案是既有编译时,也可能会有运行时...
  • 静态变量初始化的时机

    千次阅读 2017-10-02 16:40:48
    静态变量的内存分配和初始化 对于C语言的全局和静态变量,不管是否被初始化,其内存空间都是全局的;如果初始化,那么初始化发生在任何代码执行之前,属于编译期初始化。由于内置变量无须资源释放操作,仅需要...
  • 下面小编就为大家带来一篇浅谈静态变量、成员变量、局部变量三者的区别。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
  • 对编译器来说,静态成员变量初始化顺序和析构顺序是一个未定义的行为 #include <string> #include <iostream> using namespace std; class Base{ public: static int b; static int a; }; int ...
  • 全局变量,static变量初始化时间 首先,静态局部变量和全局变量一样,数据都存放在全局区域内存分布情况,所以在主程序之前,编译器已经为其分配好了内存,但在C和C++中静态局部变量的初始化节点又有点不太一样。在C...
  • 静态变量与全局变量的初始化静态和全局变量的初始化默认初始化规则 静态和全局变量的初始化初始化的全局变量和静态变量 编译器会同等处理, 放入BSS...全局变量和静态变量(包括局部静态变量)会自动初始化为0 ...
  • 4.首次初始化时赋值生效,以后的初始化赋值自动跳过 如 void fn() { static n=10; cout<<n<<endl; n++; } 这里的n是一个静态局部变量,只有第一执行fn函数时会调用static n=10,以后都不会调用 ...
  • why静态变量只能被初始化一次?

    千次阅读 2017-11-02 14:47:27
    函数1int fun() { static int i=0; i++; return i; } 当fun函数被调用时,i会一直++函数2 int fun() { int i=0; i++; return i; } 当函数被调用时只会return 1;...静态变量:作用在

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 232,424
精华内容 92,969
关键字:

局部静态变量什么时候初始化