仅包含标头的 C++ 应用程序有什么问题?

问题描述 投票:0回答:3

我想用如下所示的纯标题布局编写 C++ 应用程序代码:

// code3.h
#include <iostream>
class code3
{
public:
  void print()
  {
    std::cout << "hello " << std::endl;
  }
};

// code2.h
#include "code3.h"
class code2
{
public:
  void print()
  {
    code3 c;
    c.print();
  }
};

// code1.h
#include "code3.h"    
class code1
{
public:
  void print()
  {
    code3 c;
    c.print();
  }
};

// main.cpp
#include "code1.h"
#include "code2.h"

int main()
{
  code1 c1; 
  c1.print();

  code2 c2; 
  c2.print();
}

唯一的 cpp 文件将是主文件。其余代码将放置在头文件中。

我想知道这种方法是否存在某种性能问题。我知道在类声明中定义方法会内联它们,但由于它只是一个 cpp 文件,因此内联方法不会重复。 我只想将问题集中在性能上。我不是在谈论可扩展性、易读性、维护性或其他任何东西。我想知道这种方法是否遗漏了一些可能会产生性能问题的东西。

谢谢!

c++ header-files code-organization header-only
3个回答
4
投票

当您的项目有数百个文件(或更多)时,您会发现这变得相当不切实际,并且每次更改某些内容时都必须重新编译所有代码。

在小型软件项目中,几乎没有理由拥有不同的源文件,但拥有多个源文件也没有什么大缺点。

当源代码开始超过十几个文件时,编译时间开始增加。隔离代码的功能组也变得更加困难,这反过来又影响了您在不同的项目中使用一组代码并使用它的难易程度 - 这在处理代码时通常是一件有用的事情。


4
投票

上次我问这个问题时,我得到了大量有用的答案:http://www.daniweb.com/software-development/cpp/threads/423106/separate-headers-from-source

基本上我问为什么应该将源代码与标头分开,因为我也曾经讨厌拥有“额外”文件并在标头和源代码之间来回切换。我认为我得到的答案可能对您有用,所以我将保留上面的链接。


0
投票

我观察到

头文件中的实现

当您在头文件中有实现时,您在一个头文件中进行了更改,现在您需要重新编译依赖于该头文件的所有内容

这显然存在构建性能问题,如果您的项目很大,则无法执行此操作。

源文件中的实现

当实现位于源文件中时,如果不更改标头,项目构建速度会更快

您还可以在头文件中提出声明,通过减少包含文件的数量来进一步提高构建性能。

您也可以通过这种方式更好地组织项目,但这种方法的问题在于

标头文件会粘贴到您包含它们的位置,当在源文件中包含包含标头的标头时,这会使该源文件变大!每个源文件都会生成一个对象。

当您有很多源文件,其中包含很多(大)标头时,可执行文件的大小会变得巨大!

最好的方法

由于项目有不同的要求,因此没有单一的解决方案,但我发现

  1. 您必须将实现分离到源文件中

  2. 当某些标头很大时,假设您包含一个大标头,您一定不能将它包含在每个源文件中,这会使所有源文件变大,进而使这些源文件的对象变大并创建一个巨大的可执行文件!您必须创建一个小标头,其中包含您需要的所有功能,您必须将此标头实现到单个源文件中。

  3. 不同的源文件需要不同数量的函数、方法、类,没有理由将整个头文件粘贴到您需要的任何地方,您必须聪明地避免陷阱!

© www.soinside.com 2019 - 2024. All rights reserved.