下面是一个在模板中使用静态成员的简单示例。如果使用-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
类型的全局变量(在概念上应该与上面相同),也不会创建任何保护。
答案 0 :(得分:1)
来自the docs,强调我的:
-fno-threadsafe-statics
不要发出额外的代码来使用C ++ ABI中指定的例程进行线程安全初始化 of local statics 。您可以使用此选项在不需要线程安全的代码中略微减小代码大小。
问题中的示例程序没有任何本地static
,因此实际应用此标志没有任何内容。但是,即使不需要线程安全,静态仍然需要一个保护变量,以避免多次初始化。无法解决这个问题。