GCC仍然使用-fno-threadsafe-statics生成保护变量

时间:2018-01-07 20:03:39

标签: c++ g++ thread-safety avr-gcc

下面是一个在模板中使用静态成员的简单示例。如果使用-fno-threadsafe-statics选项使用g ++ / avr-g ++编译,则编译器仍会生成保护变量。在我看来,这是不必要的。

struct A {
    A() {}
    void foo() {}
};

template<typename T>
struct B {
    static void foo() {
        mTop.foo();
    }
    inline static T mTop;
};

int main() {
    B<A>::foo();
}

有人知道如何禁用8字节保护变量的生成吗?

编辑:如果删除空的ctor(或默认的ctor)以使用编译器生成的,则不会创建任何防护。如果你简单地创建一个A类型的全局变量(在概念上应该与上面相同),也不会创建任何保护。

1 个答案:

答案 0 :(得分:1)

来自the docs,强调我的:

  

-fno-threadsafe-statics
  不要发出额外的代码来使用C ++ ABI中指定的例程进行线程安全初始化 of local statics 。您可以使用此选项在不需要线程安全的代码中略微减小代码大小。

问题中的示例程序没有任何本地static,因此实际应用此标志没有任何内容。但是,即使不需要线程安全,静态仍然需要一个保护变量,以避免多次初始化。无法解决这个问题。