相关疑难解决方法(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万
查看次数

函数静态变量是否在GCC中是线程安全的?

在示例代码中

void foo()
{
  static Bar b;
  ...
}
Run Code Online (Sandbox Code Playgroud)

使用GCC编译是否可以保证b以线程安全的方式创建和初始化?

在gcc的手册页中,找到了-fno-threadsafe-statics命令行选项:

不要发出额外的代码来使用C++ ABI中指定的例程来进行本地静态的线程安全初始化.您可以使用此选项在不需要线程安全的代码中略微减小代码大小.

  1. 这是否意味着,默认情况下,GCC的本地静态是线程安全的?所以没有理由明确保护,例如pthread_mutex_lock/unlock

  2. 如何编写可移植代码 - 如何检查编译器是否会添加其防护?或者关闭GCC的这个功能是否更好?

c++ static gcc initialization thread-safety

58
推荐指数
4
解决办法
3万
查看次数

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

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

如果我声明一个基本类型的静态变量(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万
查看次数

为什么这段代码有效?

Matt Galloway认为这是初始化单例的正确方法:

+ (id)sharedManager {
    static MyManager *sharedMyManager = nil;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        sharedMyManager = [[self alloc] init];
    });
    return sharedMyManager;
}
Run Code Online (Sandbox Code Playgroud)

我已经测试过并且它工作正常,但我不明白为什么.首次创建单例时,变量sharedMyManager是使用init行的内容设置的,但是当单例已经创建并且我使用[MySingleton sharedManager];代码运行的第一行访问它时,设置sharedMyManagernil,然后最后一行运行返回的内容,在理论,nil.事实上,它正在返回正确的单身人士,但为什么呢?

sharedMyManager如果设置为正确的对象,如何返回nil

注意,因为sharedManager在创建单身人士之后,我正在谈论随后的调用.

我认为static关键字现在正在进行魔术,现在允许将值分配多次,但如果这是真的,则init部分不应该工作,因为静态变量首先被赋值为nil.

请解释我,因为我五岁.谢谢.

singleton cocoa-touch objective-c ios

5
推荐指数
1
解决办法
158
查看次数

静态函数返回类的静态实例 - 实例应该不一样吗?

我有以下代码:

#include <iostream>
using namespace std;

class Test {
public:
  static Test& get() {
    static Test testSing;
    return testSing;
  }
};

int main() {
  Test a = Test::get();
  Test b = Test::get();

  cout << &a << endl;
  cout << &b << endl;
}
Run Code Online (Sandbox Code Playgroud)

我认为a并且b应该有相同的地址,因为我认为它们应该只构造一次.但是,我在此测试中获得了不同的memmory地址.

我缺少一些微不足道的东西吗?他们不应该有相同的地址吗?

c++ static-methods

2
推荐指数
1
解决办法
50
查看次数

为什么这确实有效?(静电还是东西?)

所以这个方法:

int num (int a = 0)
{
static int b = a;
return b;
}
Run Code Online (Sandbox Code Playgroud)

可以用来设置和使用num(VALUE)返回一个值,但是我不明白为什么它在使用num()调用时仍然返回b.由于默认参数,它不应该返回0吗?b是静态的吗?对不起,如果这听起来很无趣,但我是这个语言的新手.

c++

-1
推荐指数
1
解决办法
57
查看次数