In this talk by Sutter a 1:15:26 è stato presentato un codice come qui di seguito,Perché questo codice è veloce per char *?
class employee{
std::string name_;
public:
template<class String, class=
std::enable_if_t< !std::is_same<std::decay_t<String>, std::string>::value > >
void set_name(String && name)
noexcept(std::isnothrow_assignable<std::string &, String>::value)
{
name_ = std::forward<String>(name);
}
}
So come std::forward
opere, se name
è un lvalue, avranno copia costruiti name_
; e se name
è un valore, name_
verrà spostato costruito. Ma nella diapositiva si dice anche che Optimized to steal from rvalues (and more)
, cosa c'è di più?
E in seguito mostra che questo codice sembra il più veloce tra tutte e quattro le implementazioni, in particolare per char *
, chiunque ha la pazienza di leggere questo codice e spiegare cosa viene ottimizzato di più e perché è il più veloce, in particolare nel caso di char *
?
Nota le funzioni a cui sta confrontando prendono un 'std :: string' in una forma o nell'altra. Se il tuo obiettivo era solo scrivere un codice che fosse veloce per 'char *' non devi _avere_ per usare l'inoltro perfetto. –