Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
C/C++ - Calloc o Malloc: scelte !
Forum - C/C++ - Calloc o Malloc: scelte !

Pagine: [ 1 2 ] Precedente | Prossimo
Avatar
comtel (Member)
Pro


Messaggi: 145
Iscritto: 08/04/2011

Segnala al moderatore
Postato alle 20:16
Mercoledì, 05/09/2018
Buonasera ragazzi,
semplicemente vorrei sapere se esiste una scelta migliore e una peggiore di fronte all'utilizzare o la malloc o la calloc. Secondo il vostro parere personale e professionale, quale delle due funzioni di buffer manipulation è migliore e in quali casi.

PM Quote
Avatar
pierotofy (Admin)
Guru^2


Messaggi: 6230
Iscritto: 04/12/2003

Segnala al moderatore
Postato alle 20:44
Mercoledì, 05/09/2018
calloc inizializza il blocco di memoria a zero.

malloc non inizializza il blocco di memoria.

Dipende dallo scopo. malloc e' probabilmente leggermente piu' veloce, ma devi stare attento ad inizializzare la memoria correttamente. calloc fa il lavoro per te, ma e' probabilmente un pochino piu' lento.


Il mio blog: https://piero.dev
PM Quote
Avatar
comtel (Member)
Pro


Messaggi: 145
Iscritto: 08/04/2011

Segnala al moderatore
Postato alle 21:04
Mercoledì, 05/09/2018
Testo quotato

Postato originariamente da pierotofy:

calloc inizializza il blocco di memoria a zero.

malloc non inizializza il blocco di memoria.

Dipende dallo scopo. malloc e' probabilmente leggermente piu' veloce, ma devi stare attento ad inizializzare la memoria correttamente. calloc fa il lavoro per te, ma e' probabilmente un pochino piu' lento.



Grazie mille per la tua risposta, avevo idea di una cosa del genere studiando le due funzioni. Il contesto che sto considerando in questo momento è l'allocazione dinamica di una matrice, ed il prodotto riga per colonna di due matrici.

PM Quote
Avatar
Mikelius (Member)
Expert


Messaggi: 525
Iscritto: 14/04/2017

Segnala al moderatore
Postato alle 10:52
Giovedì, 06/09/2018
Tieni presente che la differenza di prestazioni  è spesso insignificante.
Credo che potrebbe essere influente nell'ordine delle centinaia di migliaia di elementi da allocare.
Io consiglierei calloc, ma solamente per sicurezza. Ti potresti trovare nel caso in cui malloc nel tuo pc funzioni perchè hai la fortuna che il blocco contenga (via random) un indirizzo valido, mentre su altri pc no, causando crash del programma. E' sempre bene inizzializzare le variabili, si eviteranno problermi difficili da risolvere a chi non ha molta esperienza

PM Quote
Avatar
comtel (Member)
Pro


Messaggi: 145
Iscritto: 08/04/2011

Segnala al moderatore
Postato alle 11:00
Giovedì, 06/09/2018
Testo quotato

Postato originariamente da Mikelius:

Tieni presente che la differenza di prestazioni  è spesso insignificante.
Credo che potrebbe essere influente nell'ordine delle centinaia di migliaia di elementi da allocare.
Io consiglierei calloc, ma solamente per sicurezza. Ti potresti trovare nel caso in cui malloc nel tuo pc funzioni perchè hai la fortuna che il blocco contenga (via random) un indirizzo valido, mentre su altri pc no, causando crash del programma. E' sempre bene inizzializzare le variabili, si eviteranno problermi difficili da risolvere a chi non ha molta esperienza



Ti ringrazio per la risposta, infatti può essere che sia incappato nell'errore che tu mi hai spiegato. Proverò ad utilizzare la calloc invece della malloc e vediamo se il problema lo risolvo. In caso contrario, dovrò per forza di cose aprire un nuovo thread sul forum per capire dove si trova il problema, che ho capito solo in parte essere o a causa della funzione malloc che ho utilizzato oppure a causa della rappresentazione dei numeri interi.

PM Quote
Avatar
nessuno (Normal User)
Guru^2


Messaggi: 6378
Iscritto: 03/01/2010

Segnala al moderatore
Postato alle 13:39
Giovedì, 06/09/2018
Come detto la calloc è una malloc seguita da una inizializzazione. Se ti serve usi la calloc altrimenti no.

Per il resto la questione degli errori sugli indirizzi non ha alcun senso. Usa la malloc tranquillamente, se hai errori è colpa del resto del codice.


Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
---
Il grande studioso italiano Bruno de Finetti (uno dei padri fondatori del moderno Calcolo delle probabilità) chiamava il gioco del Lotto Tassa sulla stupidità.
PM Quote
Avatar
comtel (Member)
Pro


Messaggi: 145
Iscritto: 08/04/2011

Segnala al moderatore
Postato alle 13:58
Giovedì, 06/09/2018
Testo quotato

Postato originariamente da nessuno:

Come detto la calloc è una malloc seguita da una inizializzazione. Se ti serve usi la calloc altrimenti no.

Per il resto la questione degli errori sugli indirizzi non ha alcun senso. Usa la malloc tranquillamente, se hai errori è colpa del resto del codice.


Ho postato il codice alla quale faccio riferimento in questo thread in un altro thread, lo si può trovare facilmente perchè è recente. Se ti va di dargli un'occhiata e darmi la tua opinione..

PM Quote
Avatar
TheDarkJuster (Member)
Guru^2


Messaggi: 1620
Iscritto: 27/09/2013

Segnala al moderatore
Postato alle 23:17
Giovedì, 06/09/2018
Una piccola osservazione: calloc in teoria può allocare più elementi in una volta sola.

Questo dipende dall'implementazione ovviamente, ma se ci pensi bene facendo
sizeof(int) * x e calloc(sizeof(int), x) potresti ottenere due risultati diversi per un x molto grande: infatti la moltiplicazione può andare in overflow, mentre una implementazione di malloc con un for permette di evitare quel tipo di overflow.

Ovviamente dipende dalla specifica implementazione di calloc quindi non puoi farci affidamento (e comunque dubito avrai necessità di allocare un numero di byte abbastanza elevato da provocare un overflow)

PM Quote
Avatar
nessuno (Normal User)
Guru^2


Messaggi: 6378
Iscritto: 03/01/2010

Segnala al moderatore
Postato alle 7:32
Venerdì, 07/09/2018
Testo quotato

Postato originariamente da TheDarkJuster:

Una piccola osservazione:



In realtà non è così perché nella calloc viene effettuata la moltiplicazione con controllo dell'overflow. Non c'è differenza.

Il limite teorico rimane quello dei 2G in tutti i casi (nel mondo a 32 bit)

Ultima modifica effettuata da nessuno il 07/09/2018 alle 9:33


Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
---
Il grande studioso italiano Bruno de Finetti (uno dei padri fondatori del moderno Calcolo delle probabilità) chiamava il gioco del Lotto Tassa sulla stupidità.
PM Quote
Pagine: [ 1 2 ] Precedente | Prossimo