编译器如何解析无限引用循环?

时间:2009-05-08 09:02:09

标签: c++

// edited by Neil Butterworth to conserve vertical space
#include <stdio.h>

struct A;
struct B;

A& GetAInstance();
B& GetBInstance();

struct A {  
    A() {
        printf( "A\n" );
    }
    ~A() {
        printf( "~A\n" );
        B& b = GetBInstance();
    }
};

struct B {
    B() {
        printf( "B\n" );
    }

    ~B() {
        printf( "~B\n" );
        A& a = GetAInstance();
    }
}; 

A& GetAInstance() {
    static A a;
    return a;
}

B& GetBInstance() {
    static B b;
    return b;
}

int main( ) {
    A a;
}

考虑上述情况。我希望这会导致一个无限的引用循环,导致程序无法退出静态去初始化,但程序运行得很好,有以下打印输出:

  A
  ~A
  B
  ~B
  A
  ~A

这是出乎意料的。

编译器如何处理这种情况?它使用什么算法来解决无限递归?或者我误解了一些基本的东西?这是标准中某处定义为未定义的吗?

2 个答案:

答案 0 :(得分:6)

编译器有效地存储bool每个static以记住它是否已初始化。

这是订单:

内部主要:

  • 构建A
  • 销毁A
    • 构建static B

清理静电:

  • 销毁static B
    • 构建static A
    • 销毁static A
标准中的

3.6.3 / 1指定它应该以这种方式工作,即使在清理过程中构造static也是如此。

答案 1 :(得分:0)

这种行为可能是因为您使用的是静态实例。编译器肯定会处理静态变量的状态,以避免执行多次初始化/取消初始化。