zoukankan      html  css  js  c++  java
  • [UE4]C++静态局部变量

    void testFunc()
    {
    static int runCount = 0; // this only runs ONCE, even on
    // subsequent calls to testFunc()!
    cout << "Ran this function " << ++runCount << " times" << endl;
    } // runCount stops being in scope, but does not die here
    
    int main()
    {
    testFunc(); // says 1 time
    testFunc(); // says 2 times!
    }

    C++ 局部静态初始化是线程安全的

    对于基本数据类型而言,局部静态变量和全局变量一样都是在进入main之前初始化的,可以认为是线程安全的; 而对于自定义类型的局部静态变量(对象),编译器的做法是定义一个bool型的局部静态变量,初始化为false,然后在函数中进行判断,如果为假就进行对象的初始化操作,如果为真就直接返回对象,这样就不是线程安全的了,因为对象可能被初始化多次。可以做个测试:
    1、基本数据类型
    void fun(){
        static int a = 0x123456;
        cout << a << endl;
    }
    int b =0x111111;
    int main(){
    fun(); //在这里加断点:在内存中查看b的值,应该可以看到紧挨着就有a的值
        return 0;
    }
    2、自定义类型
    class A{
        public:
            A(){
                cout << " A " <<endl;
            }
    };
    
    void fun(){
        static A a; // 在这里加断点,查看汇编代码,可以看到有一个比较命令,转换成伪代码应该是个if语句
    }
    int main(){
        fun(); //在这里加断点,此时fun函数还没有执行,A a仍然没有初始化, 因为如果a初始化了,控制台就会有输出
    }
  • 相关阅读:
    Dockerfile
    走进Docker
    liunx 设置定时任务
    《程序员自我修养》读书笔记
    Ubuntu换源
    liunx安装python2.7.12
    预习非数值数据的编码方式
    预习原码补码
    第三章预习
    预习非数值数据的编码方式
  • 原文地址:https://www.cnblogs.com/timy/p/8624313.html
Copyright © 2011-2022 走看看