c++ - 将方法放在 .h 与 .cpp 文件中

标签 c++ optimization compiler-construction header

我见过将类的代码放在单独的 C++ 中,而方法定义放在头文件中。我的第一个 OOP 经验是使用 Java,其中所有方法都放在类文件中,我实际上更喜欢这个。

将我所有的方法放在头文件中是否会影响编译器生成的汇编代码?

如果是这样,将类的全部代码放在其头文件中是否会对性能产生不利影响?

最佳答案

关键是复杂的 C++ 程序是通过编译多个对象,然后将它们链接在一起创建的。每个对象通常是编译一个实现文件(例如“.cpp”、“.cc”等)的结果,这些文件可能直接或间接包含许多 header 。因此,如果您编写了一个好的类并将代码放入 header 中,那么该代码可以包含在多个目标文件中,然后编译器会冗余地生成它,并且进一步 - 链接器不会(也不能轻易)比较版本以查看它们是否等效并删除冗余拷贝(如果使用相对地址更容易 - “位置无关代码” - 但这是另一回事)。另请参阅下面的 jalf 评论。

因此,您不希望在 header 中使用不同的外联函数。如果它们名义上是 inline 函数 - 由于使用了 inline 关键字或在类中定义 - 那么编译器将只需要承担额外的工作并确保任何外联版本其中的一个在可执行文件中是唯一表示的。但是,对于外联函数,负担仍然落在程序员身上。

此外,如果您在 header 中提供实现,它会针对每个对象进行冗余编译,并且对 header 的任何更改都将强制重新编译所有相关对象。可以更改单独对象中的外联函数,重新编译单个对象,然后可以将其与其他预先存在的对象链接以形成新的可执行文件。在大型项目中,这可以节省大量编译时间。

关于c++ - 将方法放在 .h 与 .cpp 文件中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4384406/

相关文章:

c++ - 如何将字符串转换为 unicode 中的 wchar*

c++ - 在 C++ 代码中使用字符 `$` 或 `@` 有什么问题吗?

C++, 'operator=' 不匹配...错误

c - 如何在 Sublime Text 2 [MAC OS X] 上运行和编译 .c

c - 寄存器 const 变量将存储在哪里?

c++ - QPushButton 动态背景色

c - 64 位整数按位运算的成本与 8 位整数相同吗?

javascript - 为什么 array.map(String.fromCharCode) 这么慢?

asp.net-mvc - 在 asp.net-mvc 站点上优化 json 的最佳方法是什么

c - 枚举值解析