2012-03-16 19 views
8

L'operatore cancella automaticamente se il puntatore è nullptr. Esiste un sovraccarico delle prestazioni quando si chiama delete su un nullptr senza verificarlo da soli?Eliminazione nullptr - overhead delle prestazioni?

delete ptr; 

o

if (ptr != nullptr) delete ptr; 

Quale dei esegue sopra più velocemente se PTR si nullptr?

+7

Quest'ultimo è ridondante, quindi a parte le potenziali differenze di velocità, è peggio. – ildjarn

risposta

18

Come al solito, dipende dal compilatore.

Uso MSVC, che consente di compilare entrambe queste righe esattamente nello stesso codice.

Le regole dicono che se il puntatore è nullo, l'eliminazione non ha alcun effetto. Quindi, se non lo controlli, il compilatore deve comunque.

2

Questo è in definitiva un caso di ottimizzazione eccessiva. Su qualsiasi processore moderno, la differenza è di pochi nanosecondi.

Effettuando il controllo, il codice evita il sovraccarico di una chiamata (alla routine di cancellazione della libreria). Nel 99% dei casi, la leggera complessità extra del codice sorgente (parentesi graffe, potenziale errore di scrittura !=, ecc.) È più un problema rispetto al tempo di esecuzione extra.

+0

Il controllo deve essere nel codice generato, prima della chiamata alla libreria ':: operator delete()', poiché il compilatore non può chiamare anche il distruttore, se il puntatore è 'null'. –

2

No, non c'è nessun sovraccarico quando non si controlla se il ptr è nullptr.

Se si effettua un controllo manualmente, lo stesso controllo viene eseguito due volte, sebbene questo sia trascurabile, rispetto al costo della chiamata di sistema, ci si potrebbe aspettare che lo ptr non sia nullo.

+3

Inoltre, se si utilizza già C++ 11, si potrebbe pensare di non utilizzare affatto l'eliminazione e utilizzare invece i puntatori intelligenti? –

+1

C++ 11 non è necessario - Boost ha avuto buoni indicatori intelligenti per anni. : -] – ildjarn

+0

Ovviamente! Ma quando si trovano appena sotto la tua mano, non hai più scuse per non usarle nella maggior parte dei casi standard :) –

2

Quale di questi viene eseguito più rapidamente se ptr è nullptr?

Supponendo che l'assegno non venga ottimizzato, quello superiore sarebbe più veloce. Se viene ottimizzato, nessuno dei due sarebbe più veloce. Lasciare al compilatore.

Problemi correlati