Domanda

Scusate se questo è stato chiesto prima, non sono stato in grado di trovare proprio quello che sto cercando.

Sto leggendo i campi da un elenco e la scrittura in un blocco di memoria. Potrei

  • A piedi l'intera lista, trovare la dimensione totale necessario, eseguire una malloc e poi a piedi di nuovo la lista e copiare ogni campo;
  • A piedi l'intera lista e realloc il blocco di memoria mentre scrivo i valori;

In questo momento il primo sembra il più efficace per me (il più piccolo numero di chiamate). Quali sono i pro ei contro di entrambi gli approcci?

Grazie per il vostro tempo.

È stato utile?

Soluzione

Sei probabilmente meglio destinare una discreta quantità di spazio inizialmente, in base a ciò che si pensa è il massimo più probabile.

Quindi, se trovate avete bisogno di più spazio, non solo allocare abbastanza per l'extra, assegnare una grossa fetta in più.

Questo ridurrà al minimo il numero di riassegnazioni mentre ancora solo l'elaborazione della lista una volta.

A titolo di esempio, inizialmente allocare 100K. Se poi trovate avete bisogno di più, ri-allocare a 200K, anche se hai solo bisogno 101K.

Altri suggerimenti

Il primo approccio è quasi sempre meglio. A realloc () funziona tipicamente copiando l'intero contenuto di un blocco di memoria nel blocco appena allocata, più grande. Quindi, n reallocs può significare n copie, ognuna più grande di quello precedente. (Se si aggiunge m byte per l'allocazione di volta in volta, poi la prima realloc deve copiare m byte, il prossimo 2 m, il prossimo 3 m, ...).

La risposta pedanti sarebbe che le implicazioni sulle prestazioni interne di realloc () sono specifica implementazione, non esplicitamente definite dalla norma, in qualche applicazione potrebbe funzionare da fate magiche che muovono il byte intorno immediatamente, etc etc etc - ma in qualsiasi implementazione realistica, realloc () indica una copia.

Non reinventare la ruota e utilizzare darray di Ccan che implementa un approccio simile a quello descritto paxdiablo. Vedere darray su GitHub

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top