相关疑难解决方法(0)

C++ 11中的局部静态变量初始化是否是线程安全的?

我知道这是一个经常被问到的问题,但由于有很多变种,我想重新陈述它,并希望有一个反映当前状态的答案.就像是

Logger& g_logger() {
    static Logger lg;
    return lg;
}
Run Code Online (Sandbox Code Playgroud)

变量lg的构造函数是否保证只运行一次?

我从以前的答案中知道,在C++ 03中,这不是; 在C++ 0x草案中,这是强制执行的.但我想要一个更明确的答案

  1. 在C++ 11标准(非草稿)中,线程安全的初始化行为是否已完成?
  2. 如果以上是肯定的,那么在当前最新版本的热门编译器中,即gcc 4.7,vc 2011和clang 3.0,它们是否正确实施?

c++ thread-safety c++11

198
推荐指数
2
解决办法
6万
查看次数

如何通过编译器实现静态变量初始化?

我对函数中静态变量的底层实现感到好奇.

如果我声明一个基本类型的静态变量(char,int,double等),并给它一个初始值,我想编译器只是在main()调用之前在程序的最开始设置该变量的值.:

void SomeFunction();

int main(int argCount, char ** argList)
{
    // at this point, the memory reserved for 'answer'
    // already contains the value of 42
    SomeFunction();
}

void SomeFunction()
{
    static int answer = 42;
}
Run Code Online (Sandbox Code Playgroud)

但是,如果静态变量是类的实例:

class MyClass
{
    //...
};

void SomeFunction();

int main(int argCount, char ** argList)
{
    SomeFunction();
}

void SomeFunction()
{
    static MyClass myVar;
}
Run Code Online (Sandbox Code Playgroud)

我知道直到第一次调用该函数时才会初始化它.由于编译器无法知道第一次调用函数的时间,它是如何产生这种行为的?它本质上是在函数体中引入if块吗?

static bool initialized = 0;
if (!initialized)
{
    // construct myVar
    initialized = 1;
}
Run Code Online (Sandbox Code Playgroud)

c++ compiler-construction static initialization

20
推荐指数
2
解决办法
2万
查看次数

退出 glutFullScreen()

我不明白为什么当我按“f”时它进入全屏但不退出全屏。在这个方法的开头我已经设置了bool fullscreen = false;

这是我的切换代码:

case 'f': //toggle screenmode
    if(!fullscreen){
        glutFullScreen();
        fullscreen = true;
    } else if(fullscreen){
        glutReshapeWindow(1200, 900);
        glutPositionWindow(0,0);
        fullscreen = false;
    }
    break;
Run Code Online (Sandbox Code Playgroud)

c++ opengl glut

4
推荐指数
1
解决办法
8713
查看次数