簡體   English   中英

C中的僅標頭和靜態內聯庫

[英]Header-only and static-inline-only library in C

我在C中編寫了只有小標題和static inline庫。當應用於大型庫時,這是一個壞主意嗎? 或者只有標題版本的運行時間是否會更快? 好吧,沒有考慮明顯的編譯時間差異。

是的,這是一個壞主意 - 特別是當與更大的圖書館集成時

內聯函數的復雜性問題通常會隨着這些庫的包含而增加,並且對於更多的翻譯和更復雜的頁眉包含圖是可見的 - 這對於較大的項目來說非常常見。 隨着翻譯計數和依賴性的增加,構建時間變得更加耗時。 增加通常不是線性復雜性。

C ++中有很多原因,但C. inline導出語義不同。 簡而言之,您最終將在C中生成大量函數副本(以及函數變量)。 C ++對它們進行重復數據刪除。 C沒有。

此外,內聯不是速度的銀彈。 該方法通常會增加您的代碼大小和可執行文件大小。 大型函數可以創建更慢的代碼。 程序/功能的副本也可以使您的程序更慢。 較大的二進制文件需要更多時間來鏈接和初始化(=啟動)。 較小通常更好。

最好考慮替代方案,例如鏈接時優化,整個程序優化,庫設計,使用C ++ - 以及避免標題中的C定義。

還要記住,編譯器可以消除死代碼,鏈接器可以消除未使用的函數。

我將單元測試框架*編寫為單個C89頭文件。 基本上一切都是宏或標記靜態和鏈接時間優化(部分)重復刪除結果。

這是一個易於使用的勝利,因為與構建系統的集成是微不足道的。

編譯時間沒問題,因為這是C,但結果函數重復確實讓我感到困擾。 因此,它可以用作頭+源,而不是通過在單個源文件中的#including之前設置一個宏,例如

#define MY_LIB_HEADER_IMPLEMENTATION
#include "my_lib.h"

我不認為我會將這種方法用於更大的項目,但我認為它對於基本上是一組單元測試宏來說是最佳的。

  • 在“不要打電話給我們,我們會打電話給你”的感覺

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM