拆分程序会更改内存

Splitting program changes memory?

本文关键字:内存 程序 拆分      更新时间:2023-10-16

我想将程序中的所有类拆分为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包含最需要的include并将其包含在大多数文件中吗?这可能会使它更快(?)
  1. 我想知道,这会影响程序速度吗?一些cpp将依赖于其他主题的hpp进行编译,而多个cpp将取决于一个hpp

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

  1. 不同的cpp文件对同一文件的多次包含会导致滞后吗

包含一个文件总是会给构建时间增加一些增量。但这是你需要衡量的。如今,编译器非常擅长以一种巧妙的方式做到这一点。如果您将其与智能标头规范(标头中没有多余的include、前向声明等)和预编译标头相结合,您应该不会看到显著的放缓。

  1. 有更好的方法来分割我的代码吗

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

  1. 哪个更快

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

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

上次我检查GCC文档时,它是。

  1. 以上命令如何工作

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

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

我不建议这样做。包含使单行程序#include "foo.hpp"成功编译的最低限度。标题应该尽量做到最少和完整(有点像SO上某个质量的帖子)。

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

否。

不同的cpp文件对同一文件的多次包含会导致滞后吗?

否。

哪一个更快?

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

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

上面的命令是如何工作的?

RTF

嘿,我十三岁半了!

我们不在乎。

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

它可以,但可能不会。

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

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

一些cpp将依赖于其他主题的hpp进行编译,而多个cpp将取决于一个hpp。

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

  1. 不同的cpp文件对同一文件的多次包含会导致滞后吗

它可能会对从头开始的编译时间产生(可能微不足道)影响。

  1. 有更好的方法来分割我的代码吗

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

  1. 哪个更快

可能两者都没有。

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

是。

  1. 以上命令如何工作

使用man g++命令。

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

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

  1. 不,它不会影响速度,除非你依赖于大量优化,但作为一个自称"新手"的人,你可能还不会担心这一点。通常,在维护代码结构以提高优化与提高可维护性之间的权衡中,维护通常是更高的优先级
  2. 它可能会使编译时间更长,但不会影响可执行文件。使用适当的makefile,您可能会看到编译实际上得到了改进
  3. 这都是主观的。有些包将源拆分为每个函数
  4. 对可执行文件没有影响
  5. 是的,但建议您学习makefile,然后只编译需要编译的内容
  6. 它将编译文件,链接到一些默认库,并输出可执行文件。如果你对幕后发生的事情感兴趣,可以打开详细程度进行编译。你也可以编译到汇编程序,这可能非常有趣
  7. 理想情况下,每个源文件应该只包含它需要的头