¿Cuál es el tamaño máximo de buffers que pueden manejar memcpy / memset, etc.?

¿Cuál es el tamaño máximo de buffers que pueden manejar memcpy y otras funciones ? ¿Es esta implementación dependiente? ¿Está restringido por el tamaño (size_t) pasado como argumento?

Esto es totalmente dependiente de la implementación.

Esto depende tanto del hardware como de cualquier cosa, pero también de la edad del comstackdor. Para cualquier persona con un comstackdor razonablemente moderno (es decir, cualquier cosa basada en un estándar de principios de los 90 o más adelante), el argumento del tamaño es un size_t . Esto puede ser razonablemente el más grande sin signo de 16 bits, el mayor de 32 bits sin signo, o el mayor de 64 bits sin firmar, según el modelo de memoria que comstack el comstackdor. En este caso, solo tiene que averiguar qué tamaño de tamaño tiene en su implementación. Sin embargo, para los comstackdores muy antiguos (es decir, antes de ANSI-C y quizás para algunas versiones anteriores de ANSI C ), todas las apuestas están desactivadas.

Por el lado de los estándares, mirando a cygwin y Solaris 7, por ejemplo, el argumento del tamaño es un size_t . Mirando un sistema integrado que tengo disponible, el argumento de tamaño es un unsigned (es decir, 16 bits sin firmar). (El comstackdor para este sistema integrado se escribió en los años 80). Encontré una referencia web a algunos ANSI C donde el parámetro size es un int .

Es posible que desee ver este artículo en size_t así como el artículo de seguimiento sobre una característica errónea de algunas versiones anteriores de GCC en las que size_t se firmó erróneamente.

En resumen, para casi todo el mundo , size_t será la referencia correcta a usar. Para aquellos pocos que usan sistemas embebidos o sistemas heredados con comstackdores muy antiguos, sin embargo, necesita revisar su página de manual.

Las funciones normalmente usan 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. Generalmente es un typedef de unsigned int o unsigned long .
Es por eso que los valores devueltos por el operador sizeof son de tipo size_t .

Así que 2 ** ( sizeof(size_t) * CHAR_BIT ) le brinda una cantidad máxima de memoria que su progtwig podría manejar, pero ciertamente no es la más precisa.
( CHAR_BIT se define en limits.h produce el número de bits contenidos en un char ).

Toman un argumento size_t; por lo que la plataforma es dependiente.

Depende de la implementación, pero puede buscar en el archivo de encabezado (.h) que debe incluir antes de poder usar memcpy. La statement le dirá (busque size_t u otro).

Y luego pregunta qué es size_t, bueno, esa es la parte dependiente de la implementación.

Derecho, no puede copiar áreas que sean mayores que 2 ^ (sizeof (size_t) * 8) bytes. Pero eso no es nada de qué preocuparse, porque tampoco puede asignar más espacio, porque malloc también toma el tamaño como un parámetro size_t.

También hay un problema relacionado con lo que size_t puede representar en comparación con 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 a memcpy() con tamaños de más de unos pocos TB o menos esta semana, y aun así esa es una máquina bastante caliente … es Es difícil imaginar cómo sería una máquina en la que sería posible instalar un espacio de direcciones de 64 bits totalmente cubierto.

No se preocupe por los sistemas integrados con solo unos pocos KB de memoria de escritura total, donde no tiene sentido intentar memcpy() más información que la RAM, independientemente de la definición de size_t . ¿Piensa en lo que acaba de pasar con la stack que contiene la dirección de retorno de esa llamada si lo hiciste?

O sistemas donde el espacio de direcciones virtuales visto por un proceso es más pequeño que la memoria física instalada. Este es realmente el caso con un proceso Win32 ejecutándose en una plataforma Win64, por ejemplo. (Lo encontré por primera vez en el momento en que el sistema operativo TSX-11 se ejecutaba en un PDP-11 con 4 MB de memoria física y 64 KB de dirección virtual en cada proceso. 4 MB de RAM eran mucha memoria en ese momento, y la PC de IBM no existen todavía.)