[英]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.