分裂程序改变内存?

时间:2017-02-14 15:53:30

标签: c++

我想将程序中的所有类拆分为cpp和hpp文件,每个文件包含来自同一主题的几个类。像这样:

main.cpp中:

#include <cstdio>
using namespace std;
class TopicFoo_Class1 {
    ... (Functions, variables, public/privates, etc.)
}
class TopicFoo_Class2 {
    ... (Functions, variables, public/privates, etc.)
}
class TopicBar_Class1 {
    ... (Stuff)
}
class TopicBar_Class2 {
    ... (Stuff)
}
int main(int argc, const char** argv) { ... }

成:

foo.hpp:

class TopicFoo_Class1 {
    ... (Declarations)
}
class TopicFoo_Class2 {
    ... (Declarations)
}

foo.cpp:
#include <cstdio>
#include "foo.hpp"
void TopicFoo_Class1::function1 { ... }
void TopicFoo_Class2::function1 { ... }

bar.hpp:
class TopicBar_Class1 {
    ... (Declarations)
}
class TopicBar_Class2 {
    ... (Declarations)
}

bar.cpp:

#include <cstdio>
#include "bar.hpp"
void TopicBar_Class1::function1 { ... }
void TopicBar_Class2::function1 { ... }

main.cpp中:

#include "foo.hpp"
#include "bar.hpp"
int main(int argc, const char** argv) { ... }

计划是编译foo.obar.o,然后将main.cpp与目标文件一起编译为foo_bar_executable,而不是仅编译一个大main.cpp进入foo_bar_executable

这只是一个例子,将包括标题保护和更好的名字。

  1. 我想知道,这会影响程序速度吗?一些cpp将依赖于其他主题“hpp来编译,而多个cpp将取决于一个hpp
  2. 不同cpp个文件的多个包含相同文件会导致延迟吗?
  3. 有没有更好的方法来分割我的代码?
  4. 哪一个更快?
  5. 是否可以运行g++ main.cpp foo.cpp bar.cpp -o foo_bar_executable
  6. 上述命令如何运作?
  7. 我应该让foo.hpp包含大多数必需的包含并将其包含在大多数文件中吗?这可能会使它更快(?)

4 个答案:

答案 0 :(得分:2)

  
      
  1. 我想知道,这会影响程序速度吗?一些cpps将依赖于其他主题的hpps来编译,而多个cpps将依赖于一个hpp。
  2.   

您正在混合影响构建速度的事物与可执行文件的运行时速度。运行时速度不应该改变。对于小型项目,构建时间的差异可以忽略不计。对于较大的项目,初始构建时间可能很长,但后续构建可能会变得更短。原因是您只需要重建已更改的内容并重新链接。

  
      
  1. 不同cpp文件的多个包含相同文件会导致滞后吗?
  2.   

包含文件总是会在构建时添加一些增量。但这是你需要衡量的东西。如今编译器以巧妙的方式做到了这一点非常好。如果您将其与智能标头规范(标头,转发声明等中没有多余包含)以及预编译标头结合使用,则不应该看到显着的减速。

  
      
  1. 有没有更好的方法来分割我的代码?
  2.   

取决于代码。这是非常主观的。

  
      
  1. 哪一个更快?
  2.   

衡量你自己,我们无法为你预测。

  
      
  1. 是否可以运行g ++ main.cpp foo.cpp bar.cpp -o foo_bar_executable?
  2.   

最后我检查了GCC文档,它是。

  
      
  1. 以上命令如何运作?
  2.   

它将采用上述源文件并生成单个可执行文件

  
      
  1. 我应该让foo.hpp包含大多数必需的包含并将其包含在大多数文件中吗?这可能会使它更快(?)
  2.   

我不建议这样做。包括最小值以使单行程序#include "foo.hpp"成功编译。标题应该努力做到最小化和完整(有点像SO上的特定质量的帖子)。

答案 1 :(得分:1)

  我想知道,这会影响程序速度吗?

没有

  

不同cpp文件的多个包含相同文件会导致滞后吗?

没有

  

哪一个更快?

速度对大多数程序来说并不重要,如何排列文件对运行时性能没有影响。

  

是否可以运行g ++ main.cpp foo.cpp bar.cpp -o foo_bar_executable

  

以上命令如何运作?

RTFM

  嘿,我已经十三点半了!

我们不在乎。

答案 2 :(得分:1)

  1. 不,它不会影响速度,除非你依赖于重度优化,但作为一个自我描述的“新手”,你可能不会担心这一点。通常在维护代码结构以改进优化与提高可维护性之间进行权衡,维护通常是更高的优先级。
  2. 它可能会使编译时间更长,但不会影响可执行文件。使用正确的makefile,您可能会看到编译实际上有所改进。
  3. 这一切都是主观的。有些软件包将按功能划分源
  4. 对可执行文件没有影响。
  5. 是的,但会建议学习makefile,然后你只编译需要编译的内容。
  6. 它将编译文件,链接到一些默认库,并输出可执行文件。如果您对幕后发生的事情感兴趣,请打开详细程序进行编译。你也可以编译成汇编程序,这看起来很有意思。
  7. 理想情况下,每个源文件应仅包含所需的标头。

答案 3 :(得分:1)

  
      
  1. 我想知道,这会影响程序速度吗?
  2.   

可以,但可能没有。

如果未在单个转换单元中定义函数,则编译器无法使用内联扩展优化函数调用。但是,如果启用,某些链接器可以跨翻译单元执行内联。

另一方面,您的程序可能无法从内联优化中受益。

  

有些cpps将取决于其他主题&#39;要编译的hpps,多个cpps将取决于一个hpp。

这与编译程序的速度无关。

  
      
  1. 不同cpp文件的多个包含相同文件会导致滞后吗?
  2.   

它可能从头开始对编译时间产生(可能不显着)影响。

  
      
  1. 有没有更好的方法来分割我的代码?
  2.   

这是主观的。分割代码的次数越多,进行更改时重新编译的次数就越少。分割得越少,从头开始编译整个项目的速度就越快。

  
      
  1. 哪一个更快?
  2.   

可能都没有。

  
      
  1. 是否可以运行g ++ main.cpp foo.cpp bar.cpp -o foo_bar_executable?
  2.   

  
      
  1. 以上命令如何运作?
  2.   

使用man g++命令。

  
      
  1. 我应该让foo.hpp包含大多数必需的包含并将其包含在大多数文件中吗?这可能会使它更快(?)
  2.   

没有。包含不需要的文件会减慢编译速度。除此之外,这大大降低了拆分翻译单元的最大优势,即当小部件发生变化时,无需编译整个项目。