2010-09-06 44 views
7

Tengo como un millón de registros cada uno de aproximadamente 30 caracteres que entran por un socket. ¿Puedo leer todo en una sola cadena? ¿Hay un límite en el tamaño de cadena que puedo asignar?límite en el tamaño de cadena en C++?

Si es así, ¿de alguna manera puedo enviar datos por registros de socket por registro y recibirlos grabar por registro? No sé el tamaño de cada registro hasta el tiempo de ejecución.

Respuesta

16

para responder a su primera pregunta: ¿El tamaño máximo de una cadena C++ está dada por string::max_size

+4

Aunque es posible que desee mencionar que en la mayoría de las implementaciones de este tamaño máximo constituye esencialmente toda la memoria disponible para el proceso. – Omnifarious

+0

Cuando vi max_size, me confundió a ser el max_size ser establecido por el usuario, por lo que un poco más útil para ver como un programa: http://stackoverflow.com/questions/1521281/what-are-the-stl -string-limits? rq = 1 – Nav

2

No hay un límite oficial en el tamaño de una cadena. El software le pedirá memoria a su sistema y, mientras lo consiga, podrá agregar caracteres a su cadena.

El resto de su pregunta no está clara.

1

En teoría, no. Pero no asignes 100 GB de memoria, porque el usuario probablemente no tenga tanta RAM. Si está usando std :: strings, entonces el tamaño máximo es std :: string :: npos.

4

El único límite práctico para el tamaño de cadena en C++ es su memoria disponible. Dicho esto, será costoso reasignar su cadena al tamaño correcto a medida que continúe recibiendo datos (suponiendo que no conoce su tamaño total por adelantado). Normalmente leería fragmentos de los datos en un búfer de tamaño fijo y los decodificaría en su forma natural (sus registros) a medida que los obtiene.

8

std::string::max_size() le indicará el límite teórico impuesto por la arquitectura de su programa se ejecuta bajo. Aparte de eso, siempre que tenga suficiente espacio de intercambio de RAM y/o disco, puede tener std::strings de gran tamaño. La respuesta a su segunda pregunta es sí, puede enviar registro por registro; además, es posible que no pueda enviar grandes cantidades de datos a través de un socket a la vez; existen límites en el tamaño de una sola operación de envío. Que el tamaño de una única cadena no se conoce hasta que el tiempo de ejecución no sea un problema, no es necesario conocerlo en tiempo de compilación para enviarlo a través de un socket. Cómo enviar realmente esas cadenas de registro por registro depende de qué biblioteca de socket/red está utilizando; consultar la documentación relevante.

-1

Si estamos hablando de char* Usted está limitado con Smth alrededor de 2^32 en sistemas de 32 bits y con 2^64 en (sorpresa) los 64 bits

Actualización: esto es incorrecto. Ver comentarios

+0

¿por qué downvoting? –

+1

No bajé la voz, pero puedo entender cómo alguien podría hacerlo. A pesar de la nomenclatura, no conozco ningún sistema de "64 bits" que en realidad sea compatible con cerca de 2^64 de memoria. Los diseños actuales de la CPU generalmente están limitados a algo así como 2^42 bytes de memoria (y la mayoría de las placas base a menos de eso). –

+0

También está el problema de la fragmentación de la memoria (el rango de direcciones podría no ser contiguo) y la cuestión de si la contabilidad interna 'operator new' puede admitir bloques de memoria tan grandes. – MSalters

2

El tamaño de una cadena solo está limitado por la cantidad de memoria disponible para el programa, es más una limitación del sistema operativo que una limitación de C++. Las cadenas de C++/C tienen un final nulo, por lo que las rutinas de cadena procesarán cadenas extremadamente largas hasta que encuentren un nulo.

En Win32, la cantidad máxima de memoria disponible para datos es normalmente de 2 Gigs.

Puede leer arbitrariamente grandes cantidades de datos de un socket, pero debe tener alguna forma de delimitar los datos que está leyendo. Debe haber un final de marcador de registro o longitud asociado con los registros que está leyendo, así que úselo para analizar los registros. ¿Realmente quieres leer los datos en una cadena? ¿Qué sucede si no tienes suficiente memoria libre para guardar los datos en la memoria RAM? Sospecho que hay una manera más eficiente de manejar estos datos, pero no sé lo suficiente sobre el problema.

0

¿Qué hay de enviarlos con diferentes formatos?

en su servidor: de envío (strlen (szRecordServer)); send (szRecordServer);

en que el cliente: recv (cbRecord); alloc (szRecordClient); recv (szRecordClient);

y repetir esto millones de veces.

Cuestiones relacionadas