È improbabile che la chiamata a std::list<T>::end()
rappresenti un grosso problema di efficienza e probabilmente legge solo un singolo valore. Tuttavia, si darebbe al compilatore un suggerimento che non è destinato a cambiare memorizzandolo come variabile. Per altri contenitori può essere coinvolto un calcolo oltre alla lettura di un indirizzo di base che è un po 'più coinvolto. Ancora niente di drammatico, ma forse vale la pena di essere evitato.
Nota, tuttavia, che può anche cambiare la semantica del ciclo: se il corpo del ciclo può aggiungere elementi, l'estremità precedente può spostarsi. È interessante notare che non trovo alcun requisito specifico nella norma che affermi se std::list<T>::end()
può cambiare quando si inseriscono elementi nel contenitore (posso immaginare implementazioni in cui cambia e altre in cui non lo fa, molto probabilmente non cambia , anche se). Se si desidera ottenere un comportamento garantito quando si modifica anche l'elenco, è possibile chiamare lo list.end()
in ogni iterazione.
BTW, c'è un problema di prestazioni più grande che avrei sull'utilizzo di iterator++
anziché ++iterator
, in particolare questo è davvero ciò che l'autore ha utilizzato nel libro. Tuttavia, questa è una micro ottimizzazione come la memorizzazione del risultato di list.end()
ma uno da fare a poco prezzo.
fonte
2012-08-28 19:54:17
' std :: list :: end' è la fine di una lista collegata doppiamente, quindi è s dovrebbe essere un'operazione a tempo costante. Dato che non stai aggiungendo il ciclo, un compilatore ottimizzante dovrebbe essere in grado di memorizzarlo nella cache. – oldrinb
Questo sarebbe nel regno di "ottimizzazione prematura". Preoccuparsi troppo presto può causare problemi, specialmente perché se aggiungi o rimuovi elementi all'interno del tuo loop, la fine è in grado di cambiare. Se hai isolato una parte specifica del tuo codice (che si basa su questo) come un maiale della CPU, allora con tutti i mezzi ottimizzare, ma altrimenti ci sono pesci più grandi in mare. – Wug
@Wug Se sai che '.end()' è un tempo costante, sì (e sì, so che è richiesto che sia in C++, per questo specifico contenitore). Ma per le liste che possono essere molto lunghe e il cui '.end()' è O (n), tale ottimizzazione non è affatto prematura. – delnan