2012-12-15 16 views
5

Stavo leggendo alcuni documenti su AWL ed è stato scritto lì che la funzione end() restituisce un iteratore del byte accanto a l'ultimo elemento del contenitore.iteratori STL: container.end()

E mi chiedo, cosa succede se il contenitore occupa gli ultimi byte dell'intera memoria disponibile. Cosa succederà allora?

+0

Un puntatore è un tipo di iteratore, non il contrario. –

+0

@BenjaminLindley puoi dirmi perché è così? Sono alle prime armi ... – Kolyunya

+0

Sono solo pignolo. Quello che stavo ottenendo è che ci sono molti tipi di iteratori, non solo puntatori. Quindi non è il caso che "gli iteratori sono puntatori". * Alcuni iteratori sono puntatori e altri no. Ora, al contrario, "i puntatori sono iteratori", questo è vero, o almeno, è ciò che intendevo implicare. Tuttavia, questo in realtà non è vero. Alcuni indicatori non sono iteratori, alcuni sono solo usati come un tipo di riferimento. Quindi mi sono sbagliato. –

risposta

4

Il modello di memoria C++ garantisce che è sempre possibile creare un puntatore all'elemento dopo l'ultimo elemento di un array. Se non ce n'è, il sistema non ti permetterà di allocare un oggetto in questa posizione o si avvolgerebbe. Inoltre, si noti che questo è un potenziale problema per gli array dato che altri contenitori possono utilizzare tipi di iteratore che trattano il passato della posizione finale in qualche altra forma adatta: controllano completamente il funzionamento dell'operazione di incremento.

+0

vuol dire che non mi lascerò fare un array, che occupa l'intero disponibile al momento della memoria, giusto? Almeno un byte deve essere lasciato? Ho capito bene? – Kolyunya

+0

@Kolyunya: Il design di C++ non lo impedisce, ma la maggior parte dei sistemi operativi non lo consentirà. –

+1

@Kolyunya: Supponiamo che stiate lavorando su un sistema embedded a 16 bit e avete creato un array con un numero intero a 16 bit in posizione 0xFFFE. Aggiungi un intero (2 byte) e si avvolge per diventare 0x0000. Se fai un semplice confronto tra iteratori, sono entrambi 0 e i == end(). Tutto bene. –

3

Un iteratore di fine (almeno in senso figurato) punta solo a oltre il alla fine del contenitore. Gli articoli validi nel contenitore vanno da *container.begin() a *container.end()-1.

In altre parole, è possibile confrontare qualche altro iteratore per l'iteratore fine per vedere se they'r uguale (che ti dice che hai raggiunto la fine degli elementi del contenitore), ma si può non dereferenziamento che termina l'iteratore (cioè, non devi tentare di accedere ad un oggetto a cui si riferisce).

Modifica: Scusa, ho capito male la domanda: beh, se il contenitore ha effettivamente utilizzato l'ultimo byte di memoria (raro/improbabile, ma teoricamente possibile) di solito vedresti l'indirizzo avvolgere all'inizio della memoria, presumendo che fosse un iteratore che funzionava davvero in termini di indirizzo, ovviamente. In tal caso, di solito lo vedi trasformarsi in un indirizzo 0, che può ancora essere distinto da qualsiasi indirizzo valido (ad esempio, 0 verrà convertito in un puntatore nullo, che non può essere un puntatore valido).

In un caso tipico, tuttavia, è probabile che una cosa del genere non possa accadere. Ad esempio, nella maggior parte dei sistemi a 32 bit, l'utente è limitato all'utilizzo dei primi 2 o 3 gigabyte di spazio degli indirizzi e gli indirizzi superiori sono riservati per il sistema operativo.

+0

La domanda è chiedere cosa succede se non ci sono più indirizzi di memoria. Quindi l'iteratore punta alla memoria che non esiste fisicamente. – Mosby

+0

Cosa succede se l'ultimo elemento punta all'ultimo byte in memoria. Cosa indicherà allora? End() (almeno in senso figurato)? – Borgleader

+0

@Borgleader: niente, ma non importa. – rici