Ujj*_*yan 24 c++ compilation code-organization c++11
我已经看到了几个关于如何在C++项目中检测不必要的#include文件的问题.这个问题经常引起我的兴趣,但我从来没有找到满意的答案.
如果包含一些头文件,它们没有在c ++项目中使用,那是一个开销吗?我理解这意味着在编译之前,所有头文件的内容都将被复制到包含的源文件中,这将导致大量不必要的编译.
这种开销在多大程度上传播到编译的目标文件和二进制文件?
编译器是否能够进行一些优化以确保不会将此类开销转移到生成的对象文件和二进制文件中?
考虑到事实,我可能对编译器优化一无所知,我仍然想问这个,以防有答案.
作为一名程序员,他的工作使用各种各样的c ++库,我应该遵循什么样的编程实践来避免这种开销?让自己熟悉每个图书馆工作的唯一出路吗?
小智 24
对于几乎所有标头,它不会影响二进制文件的性能甚至二进制文件的内容.声明根本不生成代码,内联/静态/匿名命名空间定义如果不使用则会被优化掉,并且没有标题应该包含外部可见的定义(如果标题包含在多个翻译单元中,则会中断).
正如@TC指出的那样,异常是具有重要构造函数的内部可见静态对象.iostream这样做,例如.该程序必须表现得好像调用了构造函数,并且编译器通常没有足够的信息来优化构造函数.
但是,它会影响编译所需的时间以及更改标头时将重新编译的文件数.对于大型项目,这足以激励关注不必要的包含.
除了明显更长的编译时间之外,可能还有其他问题。恕我直言,最重要的一个是对外部库的依赖。您不希望您的程序依赖更多必要的库。
然后,您还需要在要构建程序的每个系统中安装这些库。这可能成为一场噩梦,尤其是当下一个程序员需要安装一些数据库客户端库时,尽管该程序从不使用数据库。
此外,尤其是库头文件通常倾向于定义宏。有时,这些宏具有非常通用的名称,它们会破坏您的代码或与您可能实际需要的其他库头文件不兼容。
当然任何#include都是开销。编译器需要解析该文件。
所以避开他们。尽可能使用前向声明。
它将加快编译速度。请参阅斯科特·迈尔斯关于该主题的书
| 归档时间: |
|
| 查看次数: |
2726 次 |
| 最近记录: |