2011-11-29 17 views
6

Używam kodu "boost :: call_traits :: param_type" na maszynie win32 program @ windows 7. Ku mojemu zaskoczeniu nie jest "podwójny", ale "const double &".dlaczego boost :: call_traits <double> :: param_type to "const double &", a nie "double"

Myślałem, że wszystkie prymitywne typy są dobre w użyciu "przekazywać według wartości" dla parametrów funkcji, czy to nie jest zdrowy rozsądek? Ponieważ wielu ludzi użyłoby is_pod do określenia odniesienia lub nie, prawda?

Odpowiedz

-1

boost::call_traits Szablon klasy nie został specjalizowany dla double. Szablon podstawowej klasy zwraca wartość const T &, dlatego jest to const double &, a nie double, chociaż nie ma to większego znaczenia w tym przypadku, ale ma znaczenie, jeśli T jest typem klasy, który ma ogromne elementy danych. Aby uniknąć niepotrzebnej kopii, jest to odniesienie do stałych.

4

Ta optymalizacja dotyczy tylko "małych" wbudowanych typów, zgodnie z doc.

Z szybkiego spojrzenia na source wynika, że ​​"małe" typy są uważane za te, które spełniają sizeof(T) <= sizeof(void *). Na komputerze 32-bitowym oczywiście nie obejmuje to double.

W niektórych przypadkach może okazać się lepiej przekazać parametry jak double zamiast double const&, ale jak zawsze, trzeba by odniesienia i test ...

Powiązane problemy