2011-11-29 2 views
6

Sto usando il codice "boost :: call_traits :: param_type" su un programma win32 @ windows 7 machine. Con mia sorpresa, non è "double" ma "const double &".why boost :: call_traits <double> :: param_type è "const double &", mentre non "double"

Ho pensato che tutti i tipi primitivi siano buoni da utilizzare "pass per valore" per i parametri di funzione, non è un buon senso? Perché molte persone userebbero is_pod per determinare se utilizzare il riferimento o no, non è vero?

risposta

-1

boost::call_traits modello di classe non è stato specializzato per double. Il modello di classe primaria restituisce const T &, ecco perché è const double &, anziché double, sebbene in questo caso non importi molto, ma è importante se il tipo di classe T è dotato di enormi membri di dati. Per evitare copie non necessarie, è un riferimento const.

4

Questa ottimizzazione si applica solo ai tipi "piccoli" incorporati, in base allo doc.

Da un rapido sguardo allo source, sembra che i "piccoli" tipi siano considerati come quelli che soddisfano sizeof(T) <= sizeof(void *). Su una macchina a 32 bit questo ovviamente non include double.

In alcuni casi può anche essere meglio per passare parametri come double piuttosto che double const&, ma come sempre, dovreste punto di riferimento e di test ...