Domanda

In C ++, io credo, un modo migliore di trattare con riallocazione è di usare uno STL vettori, in quanto garantisce le posizioni di memoria contigue.

Ho domanda paio di capire la differenza:

  1. C'è qualche scenario in cui ho bisogno per preferire realloc oltre vettore?
  2. C'è qualcos'altro (a parte dal vettore), che equivale a realloc in C ++?

Grazie,

È stato utile?

Altri suggerimenti

L'insieme di funzioni C (malloc, calloc, realloc, libero) sono operazioni di memoria prime. Creeranno / modificare / rilasciare un dato buffer nella memoria, ma la memoria non avranno alcun tipo e non costruttori verrà chiamato.

C ++ non ha un equivalente di realloc , ma solo typesafe equivalenti a malloc / libera attraverso l'uso di nuovo / nuovo [] e Elimina / Elimina [] . Le versioni C ++ saranno entrambi acquisire la memoria dal sistema e inizializzarlo chiamando i costruttori appropriate. Usando eliminare chiamare i distruttori degli oggetti e poi rilasciare la memoria. le versioni C e C ++ non sono compatibili, se si acquista memoria con malloc (anche se si chiama il costruttore inplace sulla memoria ricevuta), non è possibile rilasciare con Elimina / delete [] in quanto è un comportamento indefinito.

Utilizzando realloc in C ++ potrebbe essere pericoloso, in quanto sarà bit a bit copiare gli oggetti da una zona di memoria a quella successiva. A volte gli oggetti non tratteranno correttamente con memoria mosse (dire che il vostro oggetto ha sia un attributo e un riferimento ad esso, dopo lo spostamento bit a bit il riferimento punterà alla vecchia posizione, piuttosto che l'attributo reale). All'interno vector , ogni volta che la memoria ha bisogno di crescere, una nuova memoria sono viene acquisita con nuovo [] e quindi tutti gli oggetti sono copia (o copia costruito) nelle nuove posizioni usando l'appropriato C ++ operazioni prima di eliminare i vecchi elementi.

Ogni volta che vector cresce in termini di dimensioni (dimensioni riservato, non utilizzato dimensioni) si creerà una nuova area di memoria completa e mossa tutti gli oggetti. D'altra parte, realloc si sposta solo il blocco di memoria in un'altra posizione, se non c'è abbastanza spazio contiguo dopo il puntatore solo crescere di esso. Vettori non riduci dimensione. Mai. Quando si cancella gli elementi, la memoria riservata è ancora tenuto.

Infine, v'è un livello di astrazione in vector rispetto realloc anche per tipi POD (che sono sicuri da spostare con costrutti C-like). L'equivalente di vector sarebbe una struttura che contiene il puntatore al buffer di memoria, una conta elementi utilizzati e riservata (dimensione del buffer) e l'insieme delle funzioni che si occupano di acquisire più memoria, come necessario e aggiornamento gli indici con ciascuna operazione.

memoria contigua è garantita anche dalla realloc modo che non è una ragione per non usarlo.

Tuttavia, io preferirei usare un vettore in C ++ dal momento che è a un livello più elevato di astrazione, e quindi rende il codice più facile da scrivere.

L'unico motivo posso pensare di utilizzare realloc (oltre vector) per uno scenario matrice di tipo, è crudo velocità. E ' possono essere più veloce. E sottolineo la parola "può" - misura, non immagino

Tuttavia, si deve gestire i propri ridistribuzioni, che è più lavoro. Preferisco avere il codice che viene eseguito un po 'più lento (ammesso che corre ancora abbastanza veloce, ovviamente), se posso consegnarlo ed essere pagati più veloce.

Uno dei principali vantaggi di std :: vector è che quando si riassegna internamente dalla naturalmente crescente, si sceglie una dimensione che è 2 volte più grande della dimensione attuale (di solito - ma sempre un moltiplicatore costante). Ciò significa che push_back sono ammortizzato O (1) dei costi.

Realloc vi darà un controllo più preciso su come allocare la memoria, ma con un grande potere derivano grandi responsabilità. Se tutti si sta facendo è l'equivalente di push_back, e si realloc ogni volta che si aggiunge un elemento, che è potenzialmente un O (N) operazione su ogni aggiunta alla matrice.

Credo che sia solo un vettore.

Non ho visto nessuno che suggerirei di usare realloc in C ++.

scroll top