为什么我的代码会因为函数内部有显式构造函数的静态对象的声明而崩溃

Why is my code blowing because of declaration of a static object with explicit constructor inside a function?

本文关键字:静态 构造函数 对象 声明 崩溃 代码 我的 因为 函数 内部 为什么      更新时间:2023-10-16

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

class bar
{
  public:
    bar() { a=0; };    
  private:
    int a;
};
void func()
{
  static bar tbar;
}

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

那里发生了什么?

通过检查安腾C++ABI,我发现编译器试图实现函数范围静态变量的保护变量线程安全:

 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线程安全静态