c - C 中的仅 header 和仅静态内联库

标签 c static inline-functions header-only

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

最佳答案

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

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

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

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

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

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

关于c - C 中的仅 header 和仅静态内联库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27070141/

相关文章:

c - _Generic 和具有多个参数的函数

java - 静态数据是如何初始化的?

java - 从另一种形式java更改值

c++ - GCC 编译器内联的深度

c - 具有内部链接的内联函数?

c++ - 为什么在类中定义的 C++ 成员函数不会产生重复符号,而在 C 中会产生重复符号?

c - linux内核qemu执行make命令报错 "undefined reference to ` cprintf ''"

c - C 语言家族的名称

css - Django 静态文件 - 检测到图像但未检测到 css

objective-c - 如何在 C 或 Objective C 中的 IP/UDP 数据包中构建、格式化我自己的数据包?