¿Cuál es el tamaño máximo de almacenamientos intermedios memcpy and other functions puede manejar? ¿Es esta implementación dependiente? ¿Está esto restringido por el tamaño (size_t) pasado como argumento?¿Cuál es el tamaño máximo de memoria intermedia que memcpy/memset, etc. puede manejar?
Respuesta
Esto depende completamente de la implementación.
Esto depende tanto del hardware como de cualquier cosa, pero también de la antigüedad del compilador. Para cualquier persona con un compilador razonablemente moderno (es decir, cualquier cosa basada en un estándar de principios de los 90 o posterior), el argumento de tamaño es size_t
. Esto puede ser razonablemente el mayor sin firmar de 16 bits, el más grande de 32 bits sin firmar, o el más grande sin firma de 64 bits, dependiendo del modelo de memoria compilado por el compilador. En este caso, solo tiene que averiguar qué tamaño tiene size_t
en su implementación. Sin embargo, para muy compiladores antiguos (es decir, antes de ANSI-C y perhaps for some early versions of ANSI C), todas las apuestas están desactivadas.
Por el lado de las normas, mirando a cygwin y Solaris 7, por ejemplo, el argumento de tamaño es size_t
. Al mirar un sistema integrado que tengo disponible, el argumento de tamaño es unsigned
(lo que significa que no tiene 16 bits). (El compilador de este sistema integrado se escribió en los años 80.) Encontré una referencia web a algunos ANSI C where the size parameter is an int
.
es posible que desee ver en this articlesize_t
así como la follow-up article sobre un mal aspecto de algunas versiones anteriores del CCG donde se firmó erróneamente size_t
.
En resumen, para casi todo el mundo, size_t
será la referencia correcta para su uso. Para aquellos que usan sistemas embebidos o sistemas heredados con compiladores muy antiguos, sin embargo, debe verificar su página de manual.
Toman un argumento size_t; por lo que depende de la plataforma.
Depende de la implementación, pero puede buscar en el archivo de encabezado (.h) que necesita incluir antes de poder usar memcpy. La declaración le dirá (busque size_t u otro).
Y luego preguntas qué size_t es, bueno, esa es la parte dependiente de la implementación.
Las funciones normalmente usan un size_t
para pasar un tamaño como parámetro. Digo normalmente porque fgets()
usa un parámetro int
, que en mi opinión es un defecto en el estándar C.
size_t
se define como un tipo que puede contener el tamaño (en bytes) de cualquier objeto al que pueda acceder. En general, es un typedef de unsigned int
o unsigned long
.
Es por eso que los valores retornados por el operador sizeof
son del tipo size_t
.
Así que 2 ** (sizeof(size_t)
* CHAR_BIT
) le proporciona la cantidad máxima de memoria que su programa podría manejar, pero ciertamente no es la más precisa.
(CHAR_BIT
se define en limits.h
y proporciona el número de bits contenidos en un char
).
¿No está definido CHAR_BIT como 8? ¿O solo se define char para ser de 1 byte? –
char = 1 byte, el número de bits puede cambiar – aib
Para citar el estándar, CHAR_BIT es el "número de bits para el objeto más pequeño que no es un campo de bits (byte)", y debe ser al menos 8. Un interesante enlace: http://c-faq.com/charstring/wchar.html. –
Derecho, no puede copiar áreas que son mayores que 2^(sizeof (size_t) * 8) bytes.Pero eso no es nada de lo que preocuparse, porque tampoco puede asignar más espacio, porque malloc
también toma el tamaño como un parámetro size_t.
Creo que quieres decir "2^(sizeof (size_t) * 8)". –
Bueno, puede llamar a malloc() varias veces :) – aib
@aib, claro, pero no se le garantizarán buffers contiguos. –
También hay un problema relacionado con lo que size_t
puede representar en relación a lo que su plataforma permitirá que un proceso aborde realmente.
Incluso con la memoria virtual en una plataforma de 64 bits, es poco probable que pueda llamar al memcpy()
con tamaños de más de unos pocos TB más o menos esta semana, y aun así esa es una máquina bastante caliente .... es difícil imaginar cómo se vería una máquina sobre la que sería posible instalar un espacio de direcciones de 64 bits totalmente cubierto.
No importa los sistemas integrados con solo unos pocos KB de memoria total grabable, donde no tiene sentido intentar memcpy()
más información que la RAM independientemente de la definición de size_t
. ¿Piensas en lo que acaba de pasar con la pila que contiene la dirección de devolución de esa llamada si lo hiciste?
O sistemas donde el espacio de direcciones virtual visto por un proceso es más pequeño que la memoria física instalada. Este es realmente el caso con un proceso Win32 que se ejecuta en una plataforma Win64, por ejemplo. (La primera vez que me encontré con esto fue compartir el tiempo compartido OS TSX-11 ejecutando en un PDP-11 con 4MB de memoria física y 64KB de dirección virtual en cada proceso. 4MB de RAM era mucha memoria entonces, y el PC de IBM no existe aún.)
- 1. ¿Cuál es el tamaño máximo de paquete que puede manejar un socket de python?
- 2. ¿Cuál es el tamaño máximo de Web.config?
- 3. ¿Cuál es el tamaño máximo de un paquete In-App que puede alojar con Apple?
- 4. ¿Cuál es el tamaño máximo que puede contener una variable de sesión?
- 5. ¿Cuál es el tamaño máximo de la textura que el iPhone puede admitir?
- 6. ¿Cuál es el tamaño máximo del mensaje del datagrama AF_UNIX que se puede enviar en Linux?
- 7. Cuál es el tamaño máximo de un Node.js Buffer
- 8. ¿Cuál es el tamaño máximo de los metadatos JPEG?
- 9. ¿Cuál es el tamaño máximo que se puede establecer en maxReceivedMessageSize para NetNamedPipeBinding?
- 10. Cuál es el tamaño máximo de int (10) en Mysql
- 11. ¿Cuál es el tamaño de mi memoria de textura CUDA?
- 12. ¿Cuál es el tamaño máximo para una int en PHP?
- 13. ¿Cuál es el tamaño máximo para una cadena en C#?
- 14. ¿Cómo configuro el tamaño de memoria máximo que Redis puede usar?
- 15. Cuál es el tamaño máximo de la textura (Andengine)
- 16. ¿Cuál es el tamaño máximo de un ItemView en EWS?
- 17. Tamaño máximo de fuente que puede representar una página
- 18. que es el tamaño máximo de 'max_length' en Django
- 19. número máximo de usuarios del servidor web que apache puede manejar?
- 20. API de historial de HTML5: ¿Cuál es el tamaño máximo que puede tener el objeto de estado?
- 21. Longitud máxima de memoria intermedia para sendto?
- 22. ¿Cuál es el tamaño máximo de archivo que puedo transferir usando HTTP? Y usando FTP?
- 23. ¿Tamaño máximo de un archivo que Python puede abrir?
- 24. Buscar el tamaño máximo entero que un tipo de punto flotante puede manejar sin pérdida de precisión
- 25. Mostrar número de memoria intermedia actual
- 26. ¿Se necesita más memoria intermedia?
- 27. ¿Cuál es el tamaño máximo que podemos dar para nvarchar en sqlite?
- 28. ¿Cuál es el tamaño máximo predeterminado para un caché de Google Guava?
- 29. El tamaño máximo de archivo que se puede leer en .net
- 30. MySQL ¿cuál es el tamaño máximo de una base de datos?
Quien haya votado negativamente esto no debe haber estado programando C el tiempo suficiente para estar cerca cuando esto no estaba tan estandarizado. – Eddie
¿Los compiladores anteriores a C89 todavía son comunes? Creo que es bastante seguro depender de size_t, exceptuando el trabajo en sistemas heredados. –
Bajé la votación porque parecías decir que esta cosa size_t no está bien estandarizada, lo que por supuesto es falso. –