.cpp与.h中的函数方法定义

asi*_*mes 6 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;
}
Run Code Online (Sandbox Code Playgroud)

之前是Foo.h(还不需要Foo.cpp):

class Foo {
public:
    int m_argc;
    Foo (int argc) : m_argc(argc) {}
    void inc() { m_argc++; }
};
Run Code Online (Sandbox Code Playgroud)

Foo.h之后:

class Foo {
public:
    int m_argc;
    Foo (int argc) : m_argc(argc) {}
    void inc();
};
Run Code Online (Sandbox Code Playgroud)

Foo.cpp:

#include "Foo.h"

void Foo::inc() { m_argc++; }
Run Code Online (Sandbox Code Playgroud)

很久以前,一位同事提到可能存在导致运行时性能下降的情况.我在谷歌上寻找这个案子,但似乎无法找到它,这个问题的接受答案是我能找到的最接近的答案,但它没有给出案例,只是提到它可能发生:从标题中移动内联方法文件到.cpp文件

在旁注中,我对方法明确使用的情况不感兴趣,inline我上面链接的答案就是我能找到的最接近我正在寻找的方法

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

dla*_*ask 7

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

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

  • 模块是独立编译的.为了使函数/方法内联,其源代码必须可用,因此通常它必须存在于头文件中. (2认同)
  • 在阅读了一下后,似乎我必须使用`-flto`进行交叉模块链接时间优化,所以我认为dlask的答案是正确的.我不喜欢`-flto`的副作用,所以我猜答案是肯定的,第二种情况比较慢 (2认同)

归档时间:

查看次数:

838 次

最近记录:

10 年,11 月 前