当我把所有的代码放在标题时,我要考虑什么?
What do I have to consider when putting all code in the header?
我发现了几个地方讨论是否把定义放在头中更好(例如在这里)。然而,我找不到类似于"仅标头代码指南"的东西。链接问题的答案提到了一些缺点:
- 增加编译时间
- 不可能有循环依赖
- 没有(简单)全局对象
但这就是全部吗?
将(所有)代码放在头文件中会产生什么后果?
我保存如果我使用头保护,还是有其他陷阱?
我问这个问题的原因如下:我在一种情况下,我认为这将是最容易把所有的代码在我的头文件。它是一个(相当小的)类和函数的集合,应该被其他人包含在他们的代码中。它应该在不同的环境和不同的框架中使用。目前,我不明白为什么我应该构建我的代码(到一个库),当使用它的人可以简单地包括她/他需要的头文件并编译它。然而,独立于这个项目,我总是有一种"不好的感觉",当把代码放在头,即使我上面提到的三点都不重要。如果有人能给我一些启示,那就太好了,这样我就可以在更合理的基础上决定把代码放在哪里。
从我的个人经验出发,我通常只在头文件中放置一行函数(getter和setter),因为所有其他函数体会使头文件难以阅读和一目了然。此外,如果您的项目需要多次包含头文件(并且您在其中编写了函数代码),那么您的编译时间将会增加,因为每次编译器包含所有代码时都必须处理。
有几个主要在头文件中实现的出色库的例子,例如std库或boost。特别是,如果你想分发一个模板库,你有你没有真正的选择。
我认为,这种方法的最坏后果是:
- 爆炸编译时间:每编辑你的代码,你将不得不重建所有文件,包括头;这是一个非常严重的问题,除非你在开发时一直使用"。h"/"。cpp"方法,然后在 的末尾重新排列你的代码到头文件中。
- 二进制代码膨胀:你所有的函数都必须声明为"内联",所以你可能有一个性能改进,但你可能(1)也有二进制代码的复制每次你使用一个函数
(1)见Klaus在cppreference.com上的评论和内联描述(引用如下):
inline关键字的目的是作为优化器的指示符,表明函数的内联替换优于函数调用,也就是说,执行而不是执行调用CPU指令将控制转移到函数体,执行函数体的副本而不生成调用。这避免了函数调用产生的额外开销(复制参数和检索结果),但它可能导致更大的可执行文件,因为函数的代码必须重复多次。由于关键字inline的这个含义是非绑定的,编译器可以自由地对任何未标记为内联的函数使用内联替换,并且可以自由地生成对任何标记为内联的函数的函数调用。这些选择不会改变上面列出的关于多个定义和共享静态的规则。
- 无论我使用什么,我的输入都会被跳过
- 我提出什么条件才能再加5%的折扣
- 为什么我要从串口读取垃圾?
- 这个编译器错误究竟希望我执行什么?
- 每次我要使用外部资源时,我都会得到:collect2。exe:错误 ld 返回 1 退出状态
- 关于内存泄漏,我有什么不了解的
- mfc CEdit 我应该什么时候进行验证?
- 单元测试类无法在我要测试的同一解决方案中的另一个项目中找到类
- 尝试使用 Qt 库中的 QPixmap 将图像拆分为多个块。关于他的复制方法的工作方式,我有什么不明白的吗?
- 有人可以向我解释什么[](int i){返回i%2 == 0;} 方法
- CUDA我的共享内存代码不起作用,我缺少什么
- 为什么我要尝试在一个if语句中调用两个fucntions,但是在第一个完成后它忽略了另一个功能?(C )
- 3-D平面过滤EVD Lansac ..我要去哪里
- 无论我投入什么,我都会得到相同的答案
- 如何使用 Open MPI 使我的程序更快?我的 Open MPI 程序目前比原来慢,我有什么不明白的?
- 为什么无论我输入什么,我的时循环一直触发
- Heisenbug问题与使用dll.接下来我要做什么?
- 当我把所有的代码放在标题时,我要考虑什么?
- 我要从学习C / C++学习Java:这到底是什么?
- 我要给函数传递什么,才能自动遍历数组