C中的仅标头和静态内联库

时间:2014-11-21 20:51:55

标签: c static inline-functions header-only

我只编写小标题和static - inline - 只有C中的库。当应用于大型库时,这是一个坏主意吗?或者只有标题版本的运行时间是否会更快?好吧,没有考虑明显的编译时间差异。

2 个答案:

答案 0 :(得分:4)

是的,这是一个坏主意 - 尤其是在与更大的库集成时

内联函数的问题'复杂性通常随着这些库的增加而增加,并且对于更多的翻译和更复杂的标题包含图是可见的 - 这对于较大的项目来说非常常见。随着翻译计数和依赖性的增加,构建时间变得更加耗时。增加通常不是线性复杂性。

有很多原因导致这种情况在C ++中出现,但在C语言中却没有。inline导出语义不同。简而言之,您最终将在C中生成大量的函数副本(以及函数'变量)。 C ++对它们进行重复数据删除。 C没有。

此外,内联并不是速度的银弹。该方法通常会增加您的代码大小和可执行文件大小。大型函数可以创建更慢的代码。程序/功能的副本也可以使您的程序更慢。较大的二进制文件需要更多时间来链接和初始化(=启动)。较小通常更好。

最好考虑替代方案,例如链接时优化,整个程序优化,库设计,使用C ++ - 以及避免在标题中使用C定义。

还要记住,编译器可以消除死代码,链接器可以消除未使用的函数。

答案 1 :(得分:0)

我将单元测试框架*编写为单个C89头文件。基本上一切都是宏或标记的静态和链接时间优化(部分)重复数据删除结果。

这是一个易于使用的胜利,因为与构建系统的集成是微不足道的。

编译时间没问题,因为这是C,但是生成的函数重复确实让我感到烦恼。因此,它可以用作标题+源,而不是在单个源文件中#including之前设置一个宏,例如

#define MY_LIB_HEADER_IMPLEMENTATION
#include "my_lib.h"

我认为我不会将这种方法用于更大的项目,但我认为它对于基本上是一组单元测试宏来说是最佳的。

  • 在“不要打电话给我们,我们会叫你”感觉