循环依赖关系通常需要花费大量时间来编译吗
Do circular dependencies generally take a lot of time to compile?
编辑:使用保护修改了头文件。我忘了把这些放在这个例子里。尽管我的项目中已经有了这些
我有这两节课。
文件a.h:
#ifdef A_H
#define A_H
#include "b.h"
#include "x.h" //not related to problem, is just included
class B; //fwd declaration, needed to use getB() outside of A
class A
{
public:
A(X &x);
B &getB();
...
private:
X &x;
}
#endif
文件b.h:
#ifdef B_H
#define B_H
#include "x.h"
class A; //fwd declaration
class B
{
public:
B(X &x, A &a);
void methodThatUsesA();
...
private:
X &x;
A &a;
}
#endif
文件a.cp:
#include "a.h"
#include "b.h"
A::A(X &x):x(x){}
B& A::getB()
{
static B b(x, *this);
return b;
}
...
文件b.cpp:
#include "b.h"
#include "a.h"
B::B(X &x, A &a) : x(x), a(a){}
void B::methodThatRequiresA(){
//does its thing...
}
从它们的外部,我这样使用它们:
#include "x.h"
#include "a.h"
X x(...);
A a(x);
a.getB().methodThatRequiresA();
继续说,我有一个类B,它需要一个类a的对象才能工作,而a通过getB((提供了一个使用自己的B类型的对象,因为每个a必须只有一个B的实例,我认为这没关系。尽管编译时间增加了几秒钟,但我的项目中只多了一个类,这很少。
循环依赖项的编译需要这么长时间吗?如果是这样的话,编译这样有很多循环依赖关系的项目可能会非常耗时。
编译大型项目,尤其是优化项目可能需要很长时间。但在这种情况下,罪魁祸首是在头中没有使用保护,编译器必须多次解析同一个头文件。所以解决方案可以是(对于文件a.h(:
#ifndef A_H_
#define A_H_
//
//
#endif // A_H_
有不同的解决方案,比如MSVS等中的pragma,但这是IMO最便携的方式。符号不必完全像这样,但必须是唯一的。
相关文章:
- 使用简单类型列表实现的指数编译时间.为什么
- 是否可以在编译时初始化数组,以便在运行时不会花费时间?
- 在已经使用Git的情况下减少编译时间
- C++常量数组的编译时间较长
- 编译时间文本到数字转换 (atoi)
- 在C++中执行 N 阶乘编译时间的 3 种不同/相同方法
- 为什么具有静态存储持续时间的同一内联变量在包含在 VS2017 编译的两个翻译单元中时会构造和销毁两次
- DLLexport 类模板实例(专用化),减少了仅标头模板库的编译时间
- 为什么这段代码需要这么长时间才能用 g++ 编译?
- 替换枚举以最大化编译时间检查的最佳方法
- 不同C++功能的编译时间
- 在预编译标头中实例化模板会缩短编译时间吗?
- 使用 SCons 提取每个编译单元的编译时间
- 将 lambda 函数转换为另一个编译单元中的普通函数会缩短编译时间吗?
- std :: Invoke_result_t编译时间语法错误
- variadic函数模板:基于n编译时值在运行时间自动n输入
- 模板;constexpr;编译时间
- 如何实现声明功能-C 11,编译时间
- 如何减少编译时间:在包含未触及的头文件的情况下
- 当(执行时间)>>>(编译时间)时,多个编译单元是否仍然值得?