C++ 为什么我的代码会因为在函数中声明了一个带有显式构造函数的静态对象而崩溃?

C++ 为什么我的代码会因为在函数中声明了一个带有显式构造函数的静态对象而崩溃?,c++,gcc,C++,Gcc,当我声明一个在函数中有显式构造函数的类bar的静态对象时,我得到了很多我没有预料到的stdc++库开销(包括异常处理,尽管-fno异常) 如果bar的构造函数不是显式声明的,我就不会得到这个开销。我使用的是gcc V4.5.2 >发生了什么? 通过检查ItAuthC++ C++ ABI,发现编译器试图实现函数范围静态变量THealSealth:的保护变量。 if (obj_guard.first_byte == 0) { if ( __cxa_guard_acquire (&

当我声明一个在函数中有显式构造函数的类bar的静态对象时,我得到了很多我没有预料到的stdc++库开销(包括异常处理,尽管-fno异常)

如果bar的构造函数不是显式声明的,我就不会得到这个开销。我使用的是gcc V4.5.2


>发生了什么?

通过检查ItAuthC++ C++ ABI,发现编译器试图实现函数范围静态变量THealSealth:

的保护变量。
 if (obj_guard.first_byte == 0) {
    if ( __cxa_guard_acquire (&obj_guard) ) {
      try {
    ... initialize the object ...;
      } catch (...) {
        __cxa_guard_abort (&obj_guard);
        throw;
      }
      ... queue object destructor with __cxa_atexit() ...;
      __cxa_guard_release (&obj_guard);
    }
  }
由于这个原因,异常处理等被包括在内,导致代码大小的大幅增加。。。不适用于嵌入式项目。要禁用此线程安全行为,请使用编译器选项

-fno线程安全静态


首先,您希望通过完全优化进行编译。第二,使您的ctor
noexcept
。第三,为什么不更新gcc版本?您是否尝试过使您的
ctor
constexpr
?这将消除动态初始化,从而消除所有开销。当然,我启用了代码优化(-Os)。更新的gcc版本会很好,但由于公司原因,没有选择。使用ctor constexpr没有什么区别。但是谢谢你的提示。在我的测试中, CONTXPRPR <代码>使所有的不同:<代码>显式< /Cord>是关键字:在谈论C++代码时不要用它作为一个不同的概念。
 if (obj_guard.first_byte == 0) {
    if ( __cxa_guard_acquire (&obj_guard) ) {
      try {
    ... initialize the object ...;
      } catch (...) {
        __cxa_guard_abort (&obj_guard);
        throw;
      }
      ... queue object destructor with __cxa_atexit() ...;
      __cxa_guard_release (&obj_guard);
    }
  }