2012-10-12 95 views
8

Duplicar posible:
c difference between malloc and calloc
Why does calloc require two parameters and malloc just one?¿Cuál es la necesidad de tener parámetros "nmem" y "tamaño" en las funciones C?

me he dado cuenta de esto con muchas funciones C llama especialmente las que tienen que ver con las operaciones de memoria o de archivo, pero no todos ellos utilizan tanto parámetros. Por ejemplo, malloc se pasa un parámetro, el tamaño en bytes del espacio de memoria necesario. Calloc por otro lado pasa dos parámetros, el tamaño en bytes de un elemento y el número de elementos (tamaño y nmem). Hay otras funciones que también usan estos parámetros de tamaño y nmem.

Esencialmente la llamada calloc asignaría la misma cantidad de memoria como llamar a malloc (nmem tamaño) así que todo lo que está sucediendo realmente es el asterisco () se sustituye por una coma (,). Al menos esto es todo lo que puedo decir desde el nivel superior en el que estoy trabajando. No veo la diferencia de llamar a calloc (1, nmem tamaño), calloc (nmem tamaño, 1) o calloc (nmem, tamaño).

¿Hay algo que realmente sucede en un nivel inferior que hace que llamar a calloc (1, nmem * size) sea fundamentalmente diferente de calloc (nmem, tamaño)?

Editar: Sé la diferencia funcional entre calloc y malloc. Me interesa saber por qué hay diferencias en los parámetros. Hay otras funciones que usan 2 parámetros de tamaño para el tamaño total (fread, fwrite, etc.). No me preocupan las funciones específicas, sino más bien por qué hay dos parámetros para el tamaño total utilizado en la función cuando esencialmente el tamaño total se convierte en los dos parámetros multiplicados. La mayoría de las veces, cuando uso estas funciones, utilizo el tamaño que necesito en el parámetro "tamaño" y un "1" para el parámetro "nmem" (a veces "conteo", etc.).

+1

alineación de memoria (en plataformas donde importa) con la forma de dos parámetros. – wallyk

+0

En cuanto a 'malloc()' y 'calloc()' se encuentra una diferencia interessting aquí explicada: http://stackoverflow.com/a/1585987/694576 ... - de todos modos, ¿te importaría indicarnos las otras funciones? , además de los dos últimos, tienes en mente. – alk

+2

@Paciv no es tan un duplicado como esa pregunta y sus respuestas no abordan la diferencia en el número de parámetros. –

Respuesta

0

¿Hay algo sucediendo realmente en un nivel inferior que hace llamando por ejemplo calloc (1, * nmem tamaño) fundamentalmente diferente de calloc (nmem, tamaño)?

Este intento de explicar las cosas es puramente dependiente de la implementación de libc - y por lo tanto a la izquierda en la apreciación de un autor libc específica:

Desde calloc() está poniendo a cero la memoria, la razón podría haber sido que podría (potencialmente) perder algunos ciclos más al hacer un mult.

En contraste, malloc() tiene la posibilidad de usar un valor precalculado, lo que reduce potencialmente la sobrecarga en una llamada que puede ser más simple de satisfacer.

No olvide que C se diseñó en un momento en que cada ciclo de CPU costaba mucho, por lo tanto, un diseño muy delgado en comparación con muchos otros lenguajes de "nivel superior".

Esta pregunta probablemente podría ser mejor respondida por el autor de C Dennis Ritchie.

+0

Dennis Ritchie no responderá preguntas en el corto plazo, excepto por ouija board ... –

2

En un comentario a la pregunta, escribí que calloc() permite una mejor alineación de la memoria para las plataformas donde sea importante. No he podido encontrar nada para apoyar eso (todavía). Estoy bastante seguro de que era una característica del compilador VMS/VAXC, pero la fuente para eso es escasa.


Sin embargo, he encontrado que calloc() y alloc() apareció al mismo tiempo, con el lanzamiento de Unix V6 en mayo de 1975. En V5, liberado 11 meses antes, ni la función está presente; la biblioteca kernel y runtime (y el ensamblador y el compilador C) se escribieron en ensamblaje.

En el comunicado de V6, calloc is implemented como el de cuatro líneas módulo de código fuente:

calloc(n, s) 
{ 
return(alloc(n*s)); 
} 

calloc() no borra la memoria asignada; ver alloc(), y no había man página para calloc() en V6; sin embargo, el man page for alloc():

DESCRIPCIÓN
Alloc y libre proporcionan un simple paquete de gestión de núcleo de propósito general. Alloc tiene un tamaño en bytes; devuelve un puntero a un área de al menos ese tamaño que es par y, por lo tanto, puede contener un objeto de cualquier tipo. El argumento libre es un puntero a un área previamente asignada por alloc; este espacio está disponible para futuras asignaciones.

Ni que decir tiene, grave desorden dará como resultado si el espacio asignado por alloc es invadida o si algún número aleatorio es entregado a libre.

La rutina utiliza un algoritmo de primer ajuste que fusiona los bloques liberados con otros bloques que ya están libres. Llama a sbrk (ver "break (II))" para obtener más núcleo del sistema cuando ya no hay espacio adecuado libre.

DIAGNOSTICS
Devoluciones -1 si no hay núcleo disponible.

ERRORES
La memoria asignada contiene basura en lugar de eliminarse.

¡Ni siquiera NULL se devuelve en caso de agotamiento de la memoria!

calloc() aparece por primera vez formalmente en UNIX V7, enero de 1979, junto con varios otros improvements:

  • calloc() borra la memoria devuelta.
  • alloc() se renombró a malloc()
  • realloc() apareció
  • en el caso de agotamiento de la memoria o un error de montón, las funciones "devuelven un puntero nulo (0)" se mejora
+0

Disculpas si me perdí algo, pero ¿cómo responde esto a la pregunta? Todo lo que veo en el código es que calloc es solo un llamado a alloc, pero hace la multiplicación por ti. ¿Se llega a la conclusión de que es solo una sutileza o que solo se trata de un detalle de implementación aleatorio que un desarrollador inventó? – kurtzbot

Cuestiones relacionadas