Io lavoro per una società che ha un reparto "Middleware" proprio per mantenere un paio di centinaia di librerie che vengono comunemente utilizzati da un gran numero di squadre.
Pur essendo nella stessa azienda, si teme di intestazione unico approccio e preferiscono favorire compability binario sulle prestazioni a causa della facilità di manutenzione.
Il consenso generale è che il guadagno di performance (se presente) non varrebbe la pena.
Inoltre, il cosiddetto "codice-gonfiare" può avere un impatto negativo sulle prestazioni più codice da caricare nella cache implica più di cache miss, e questi sono gli assassini di prestazioni.
In un mondo ideale Suppongo che il compilatore e il linker potrebbe essere abbastanza intelligente non generare tali norme "più definizioni", ma fino a quando non è il caso, io (personalmente) favorevoli:
- compatibilità binaria
- non inlining (per i metodi che sono più di un paio di righe)
Perché non si prova? Preparare le due librerie (una solo intestazione e l'altra senza metodi di allineamento su un paio di righe) e controllare le rispettive prestazioni nel TUO caso.
EDIT:
E 'stato sottolineato da 'JALF'(grazie) che dovrei preciso quello che volevo dire esattamente dalla compatibilità binaria.
2 versioni di una data libreria si dice compatibile binario se è possibile (di solito) Link contro l'uno o l'altro senza alcun cambiamento della propria libreria.
Poiché è possibile collegare soltanto con una versione di una data libreria Target
, tutte le librerie caricate che l'uso Target
utilizzerà effettivamente la stessa versione ... e qui è la causa della transitività di questa proprietà.
MyLib --> Lib1 (v1), Lib2 (v1)
Lib1 (v1) --> Target (v1)
Lib2 (v1) --> Target (v1)
Ora, dicono che abbiamo bisogno di una correzione in Target
per una funzione utilizzata solo da Lib2
, forniamo una nuova versione (v2)
.Se (v2)
è compatibile a livello binario con (v1)
, allora possiamo fare:
Lib1 (v1) --> Target (v2)
Lib2 (v1) --> Target (v2)
Tuttavia, se non è il caso, allora avremo:
Lib1 (v2) --> Target (v2)
Lib2 (v2) --> Target (v2)
Sì, avete letto bene, anche se Lib1
fatto Non è richiesta la correzione, è necessario ricostruirla con una nuova versione di Target
poiché questa versione è obbligatoria per l'aggiornamento Lib2
e Executable
è possibile collegarsi solo a una versione di Target
.
Con una libreria di sola intestazione, poiché non si dispone di una libreria, non si è effettivamente compatibili binari. Quindi ogni volta che fai qualche correzione (sicurezza, bug critico, ecc ...) devi consegnare una nuova versione e tutte le librerie che dipendono da te (anche indirettamente) dovranno essere ricostruite contro questa nuova versione!
Come funziona solo intestazione librerie implica pesantezza del codice? Generalmente il compilatore non sarà in linea se significa codice significativamente più grande. E, del resto, in che modo la compatibilità binaria è influenzata dalle librerie di sola intestazione? – jalf
@Matthieu: I test sono in effetti sempre buoni per determinare quale darebbe i risultati migliori. – DrYak
@Jalf: *** 1. Scenario di intestazione: per ogni singola modifica alla libreria un aggiornamento alla libreria significa ricompilare ogni ultimo progetto che ha dipendenza da esso. (Pensa alla situazione di Matthieu: centinaia di librerie, un sacco di squadre, molte ricompense coinvolte). *** 2. scenario solo binario: per molte modifiche diverse, un aggiornamento comporterà semplicemente il rilascio di un nuovo file .SO o .DLL, a condizione che l'ABI rimanga lo stesso. Sebbene la nuova funzionalità possa modificare le firme dei metodi e le strutture di dati, gli aggiornamenti critici (sicurezza o stabilità) raramente. – DrYak