C 中的仅头文件和仅静态内联库

xiv*_*r77 5 c static inline-functions header-only

我在 C 中编写了仅包含头文件的小库和static-inline仅库。当应用于大型库时,这会是一个坏主意吗?或者是否有可能使用仅标头版本的运行时间会更快?好吧,不考虑明显的编译时间差异。

jus*_*tin 3

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

随着这些库被包含并且对更多翻译和更复杂的标头包含图可见,内联函数的复杂性问题通常会增加——这在较大的项目中很常见。随着翻译数量和依赖性的增加,构建变得更加耗时。这种增加通常不是线性复杂性的。

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

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

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

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