2010-11-22 8 views
9

Eventuali duplicati:
c difference between malloc and callocpreferendo malloc sopra calloc

C'è qualche situazione in cui si preferisce malloc sopra calloc. So che sia malloc che calloc allocano la memoria in modo dinamico e che calloc inizializza anche tutti i bit nella memoria assegnata a zero. Da ciò suppongo che sia sempre meglio usare calloc su malloc. O ci sono delle situazioni in cui malloc è migliore? Le prestazioni potrebbero essere?

+0

Votazione per riaprire questo. L'altra domanda riguarda le differenze. Questa domanda è diversa. Si chiede perché si preferirebbe malloc (che è una pratica comune). –

+0

@RaymondHettinger, se ricordo bene, non importa se le loro risposte sono le stesse. –

risposta

19

Se è necessario inizializzare la memoria allocata dinamicamente, utilizzare calloc.

Se non è necessario inizializzare la memoria allocata dinamicamente, utilizzare malloc.

Non è sempre necessaria la memoria inizializzata a zero; se non è necessario inizializzare la memoria zero, non pagare il costo di inizializzarlo. Ad esempio, se si assegna memoria e quindi si copia immediatamente i dati per riempire la memoria allocata, non vi è alcuna ragione per eseguire l'inizializzazione zero.

calloc e malloc sono funzioni che fanno cose diverse: utilizzare quello più appropriato per l'attività che è necessario eseguire.

+0

Grazie.performance è un buon punto. Ero anche interessato a sapere se c'è qualche altra possibile ragione. – user514946

+1

(Ugh ... hanno chiuso la tua domanda, che è leggermente diversa dal "duplicato" ... Odio S.O. a volte.) Comunque, ci sono diversi motivi per cui potresti voler usare calloc su malloc. Uno è che programmi come valgrind pubblicheranno molti avvisi potenzialmente falsi con malloc. Un altro è legato all'esposizione di bug. L'uso della memoria non inizializzata può causare un comportamento irregolare che potrebbe farti notare un errore che altrimenti non sarebbe passato inosservato se si usasse calloc. –

2

Affidarsi all'inizializzazione zero del calloc può essere pericoloso se non si presta attenzione. La memoria di azzeramento dà 0 per i tipi interi e \ 0 per i tipi di carbone come previsto. Ma non necessariamente corrisponde a virgola mobile/doppio 0 o NULL.

0

Normalmente stai allocando memoria con l'intento specifico di archiviare qualcosa lì. Ciò significa che (almeno la maggior parte) lo spazio inizializzato a zero da calloc verrà presto sovrascritto con altri valori. Di conseguenza, la maggior parte del codice utilizza malloc per un po 'di velocità extra senza perdite reali.

Quasi l'unico utilizzo che ho visto per calloc era il codice che era (presumibilmente) il benchmarking della velocità di Java rispetto a C++. Nella versione C++, allocava memoria con calloc, quindi utilizzava memset per inizializzare nuovamente la memoria in (ciò che mi sembrava) un tentativo abbastanza trasparente di produrre risultati che favorivano Java.