【发布时间】:2015-09-15 05:31:49
【问题描述】:
为了减少一个相当大的框架在工作中的编译时间,我正在考虑将 .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
附带说明,我对方法明确使用inline 的情况不感兴趣,我上面链接的答案只是我能找到的最接近我正在寻找的答案
什么情况(如果有)会导致运行时间变慢?
【问题讨论】:
-
您的示例可能会放缓。在当前代码中,
inc函数被定义为内联非虚函数,因此编译器可以内联函数而没有函数调用开销。新版本需要完整的函数调用。如果大量使用inc函数,则内联函数可以节省大量资金。如果很少使用,则开销无关紧要。 -
@JonathanLeffler,谢谢,没有意识到这已经是我正在寻找的情况。我意识到在原始实现中内联是由编译器决定的,但是有没有办法在移动的版本中保留编译器的决定?
-
(只是把这些信息放在这里,我是在阅读 cmets 后发现的)据我所知,我需要
-flto来优化跨模块链接时间。没有它,第二种情况将涉及函数调用,因此会更慢。但是-flto有一些副作用(它可以增加文件的大小) -
只是想添加两个很好的参考:Can the linker inline functions? 和关于Benefits of inline functions in C++? 的更一般性的讨论。
标签: c++