Il ne compare pas la même chose... D'un côté, il passe un pointeur nu par valeur à une fonction, puis appelle une fonction sur l'objet pointé. Dans l'autre cas, il passe à la fonction un unique_ptr par référence, puis appelle la même fonction. Il y a donc deux déréférencements, un pour la référence, un pour le unique_ptr. S'il avait passé son pointeur nu par référence, il aurait eu même code (sauf si le compilateur est capable de mieux optimiser le code plus simple, ce qui reste à mon avis la seule source de différences potentielle de perf entre T* et unique_ptr<T>).
Sachant que passer un unique_ptr par référence à une fonction est assez rare, la manière correcte restant, même en présence d'unique_ptr, de passer un T* quand la fonction utilise l'objet pointé sans interférer avec la durée de vie de ce dernier (cas très courant).
Pointeur nu => unique_ptr
void f(T*p) => void f(T* p) (ou si un jour ça existe void f(observer_ptr<T> p))
void f(T *&p) => void f(unique_ptr<T> &p)
Partager