如何防止GCC为静态成员生成防护措施

问题描述 投票:0回答:1

以下是一个最小示例,有时会生成警卫,而有时却不会:

struct A {
    inline A(int v = 0) {} // without ctors, guards are omitted
    int m1() const {
        return m;
    }
private:
    int m = 0;
};

//namespace { // without anon-ns guards are generated 
    template<typename T>
    struct X {
        static int foo() {
            return m.m1();
        }
        inline static T m; // even as local-static and -fno-threadsafe-statics, guards are generated  
    };
//}

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

总结:

  • 没有A类中的ctor,永远不会生成警卫
  • 使用anaon-ns也可以防止守卫
  • 使静态成员m成为foo()中的静态局部,仍然会生成防护(使用-fno-threadsafe-statics

因此,如何在类A具有ctor且无法使用anon-ns的情况下生成防卫措施?

c++ static g++
1个回答
0
投票

您可以将A的构造函数声明为constexpr,以便X<A>::m被静态初始化。

如果变量需要动态初始化,则必须使用防护措施来防止多次初始化。

© www.soinside.com 2019 - 2024. All rights reserved.