Visualizzazione dei risultati da 1 a 10 su 10
  1. #1
    Utente di HTML.it
    Registrato dal
    Mar 2012
    Messaggi
    214

    [C] Inline e librerie statiche.

    Ciao a tutti, volevo chiedervi un parere. Ho costruito un insieme di funzioni, che inserisco in una libreria statica per una maggiore efficienza in fase di elaborazione. Avendo usato in diverse occasioni durante la stesura del codice la definizioni di funzioni inline mi chiedevo: inserendo questo codice in una libreria, le prestazioni della stessa sono migliorate, o è totalmente inutile? Faccio un esempio per chiarire:

    lib_fun.h :
    codice:
    #ifndef LIB_FUN_H
    #define LIB_FUN_H
    
    inline int sum(int a, int b); 
    #endif
    lib_fun.c :
    codice:
    #include "lib_fun.h"
    
    extern int sum(int a, int b); 
    
    ... ... ...
    Creo la libreria: ar -r libuno.a lib_fun.o
    Quando andrò a compilare un programma che utilizza queste funzioni, inserirò -luno.a .

    Dunque, l'utilizzo di inline nelle funzioni della libreria, mi produce qualche vantaggio?

  2. #2
    Utente di HTML.it
    Registrato dal
    Sep 2012
    Messaggi
    707
    Da scarsissimo utilizzatore di funzioni inline credo che utilizzare una libreria statica sia come utilizzare i vari files oggetto, quindi non è tanto il problema della libreria statica ma dalla combinazione delle parole chiave "inline", "static" e "extern". Vedi un po' qui:
    - http://gcc.gnu.org/onlinedocs/gcc/Inline.html
    - http://www.greenend.org.uk/rjk/tech/inline.html

  3. #3
    Se il compilatore al momento di compilare non "vede" il corpo della funzione (che è già compilata dentro alla libreria) inline sostanzialmente non serve a niente. Devi mettere il corpo della funzione nel .h.
    Amaro C++, il gusto pieno dell'undefined behavior.

  4. #4
    Utente di HTML.it
    Registrato dal
    Sep 2012
    Messaggi
    707
    Ha ragione MItaly, ho sbagliato io, dev'essere quello che qui http://www.greenend.org.uk/rjk/tech/inline.html scrive con: "If you want to use it from other translation units to the one where it is defined, you put a declaration in a header file". Quindi se non sbaglio anche qui, il prototipo nel file .h e la definizione nel file .c ha effetto solo se sto usando quella funzione in quel file .c

    Aggiungo per curiosità che ho letto per gcc esiste il "Link Time Optimization (LTO)": a form of whole program optimization that lets it inline functions from separate object files (http://stackoverflow.com/questions/5...line-functions). Gli oggetti devono essere già stati compilati con -flto.

  5. #5
    Utente di HTML.it
    Registrato dal
    Mar 2012
    Messaggi
    214
    Ok, grazie mille!

  6. #6
    Originariamente inviato da c0der
    Aggiungo per curiosità che ho letto per gcc esiste il "Link Time Optimization (LTO)": a form of whole program optimization that lets it inline functions from separate object files (http://stackoverflow.com/questions/5...line-functions). Gli oggetti devono essere già stati compilati con -flto.
    Sì, è una funzionalità che si sta diffondendo negli ultimi anni tra i compilatori; in VC++, ad esempio si chiama LTCG (link time code generation). Il problema però mi pare che sia che gli oggetti così compilati funzionano solo con la specifica versione del compilatore usata (o almeno, questo valeva per VC++, non so per gcc), per cui può essere un po' problematico da usare con librerie statiche.
    Amaro C++, il gusto pieno dell'undefined behavior.

  7. #7
    Utente di HTML.it
    Registrato dal
    Mar 2012
    Messaggi
    214
    Esiste un modo teorico per determinare i vantaggi in termini prestazionali che può offrire una libreria statica piuttosto che l'utilizzo di funzioni inline? Sto cercando di rendere più performanti possible alcune parti del mio codice. Al momento uso una libreria statica che raccoglie tutte le funzioni chiamate dal programma, ma non riesco a capire se è la maniera migliore di procedere...

  8. #8
    Originariamente inviato da Smoke666
    Al momento uso una libreria statica che raccoglie tutte le funzioni chiamate dal programma, ma non riesco a capire se è la maniera migliore di procedere...
    Una libreria statica non è altro che una raccolta di moduli oggetto, perché pensi di ottenere miglioramenti di prestazioni?
    Amaro C++, il gusto pieno dell'undefined behavior.

  9. #9
    Utente di HTML.it
    Registrato dal
    Mar 2012
    Messaggi
    214
    Ho sempre letto che l'utilizzo di librerie statiche "aiuta" le prestazioni in fase di esecuzione di un programma a scapito della fase di caricamento, poichè gravata di dover caricare la libreria. Una volta avviato però, si hanno migliorie delle prestazioni. L'ho letto più volte, ti linko il primo link che ho trovato stasera con una ricerca in google:


    http://www.linguaggio-c.it/Libreria%20statica.html

    Non è così? Non si ha alcun vantaggio a run-time?

  10. #10
    Forse rispetto ad una libreria dinamica... una libreria statica corrisponde a compilare i vari .cpp tutti insieme (dato che appunto è una collezione di moduli oggetto), e non presenta sostanziali vantaggi in termini di prestazioni rispetto a questa soluzione.
    Amaro C++, il gusto pieno dell'undefined behavior.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.