.cpp与.h

时间:2015-06-28 19:47:17

标签: c++

为了减少工作中相当大的框架的编译时间,我正在考虑将.h文件中的类方法定义移动到它们关联的.cpp文件中,如果它们非常大或者需要包括编译可以移动到关联的.cpp文件。为清楚起见,下面是一个人为的例子(虽然Foo::inc是一个很小的方法)

的main.cpp

#include "Foo.h"

int main(int argc, char** argv) {
    Foo foo(argc);
    foo.inc();
    return foo.m_argc;
}
之前

Foo.h(还不需要Foo.cpp)

class Foo {
public:
    int m_argc;
    Foo (int argc) : m_argc(argc) {}
    void inc() { m_argc++; }
};

Foo.h

class Foo {
public:
    int m_argc;
    Foo (int argc) : m_argc(argc) {}
    void inc();
};

Foo.cpp中

#include "Foo.h"

void Foo::inc() { m_argc++; }

很久以前,一位同事提到可能会出现导致运行时性能下降的情况。我在谷歌上寻找这个案子,但似乎无法找到它,这个问题的接受答案是我能找到的最接近的答案,但它没有给出案例,只是提到它可能发生:Moving inline methods from a header file to a .cpp files < / p>

另一方面,我对一个方法明确使用inline的情况不感兴趣,我上面链接的答案就是我能找到的最接近的东西

什么情况(如果有的话)会导致运行时间减慢?

2 个答案:

答案 0 :(得分:7)

您的原始方法void inc() { m_argc++; }自动inline,因此允许编译器使用内联版本替换调用。

只要将方法移出类定义到模块,此方法就不再是inline,内联扩展不会发生,标准方法调用就在那里,结果可能会慢一些。

答案 1 :(得分:2)

减少头依赖关系始终是减少编译时间的好主意。它是What techniques can be used to speed up C++ compilation times?

等商家信息中的热门商品之一

我建议 - 如果还没有完成 - 请通过Profiling the C++ compilation process

来了解主要玩家的编辑时间。

还有助手可以对您的包含依赖项进行排序,请参阅Automate #include refactoring in C++

关于将代码移动到源文件会降低运行时性能的问题:这取决于。一般来说,如果在头文件中有函数,可以说你给编译器一个内联的机会。

我想引用C++ FAQ - Inlining

  

内联函数可以提高性能吗?

     

是和否。有时。也许

     

没有简单的答案。内联函数可能会生成代码   更快,他们可能会变慢。他们可能会制作可执行文件   更大,它们可能会变小。他们可能会引起颠簸   可能会阻止颠簸。它们可能是,而且往往是完全的   与速度无关。

编译器 - 以及后来的链接器 - 对它的作用取决于您使用的编译器工具链以及您提供的compiler / linker选项。

参见例如在inline - Using the GNU Compiler Collection中发生的所有事情:

  

... GCC在不优化时不会内联任何函数......

一些参考文献: