Los foros del Guille

Si no encuentras respuesta, puedes buscar en el sitio del Guille

Google
 

elGuille.hosting: Ofertas de alojamiento
posiblemente los mejores precios
¡¡¡ Ahora con el doble de casi todo !!!

Selecciona el foro y pulsa en mostrar:     Mostrar 
De tu interés (algunos de los avisos publicados)

23/ene/2006
Por favor, no pidáis que os respondan de forma particular a vuestras consultas, ya que se supone que un foro es para compartir dudas y respuestas, de forma que otros se beneficien de esas respuestas.
También os pediría que antes de preguntar busquéis la respuesta, en muchas ocasiones ya estará.
Gracias.

  Foro: C / C++.General Cantidad:  Desde:   Hasta:    Aplicar   Responder 
Respuestas a: 54501 - Memoria y cadena de caracteres.
IDAsuntoFechaNick 
54501 Memoria y cadena de caracteres.24/12/10 12:17Mr. VB 6   
Hola a todos:
Estoy haciendo una mini clase para manejo de cadena de caracteres (es que por alguna razon, larga de explicar, tengo que ignorar las librerias estandar). Mi pregunta es como manejar la cantidad de memoria que uso, tengo dos ideas:
1. Tener en memoria SOLO lo que uso hasta un maximo de X caracteres (o bytes), es decir, que si mi cadena es
"Mi nombre es Agustin" (que tiene 20 caracteres), mi bloque de memoria es de 21 Bytes (si cada caracter es un byte). El ultimo byte es para el caracter nulo. Y si le concateno
" y me gusta el verano" (de 21 caracteres) el bloque de memoria seria de 20 + 21 + 1 = 42 bytes.

2. Tener siempre X caracteres, es decir si X es 30 y yo mi cadena es "hola" de todas formas el bloque de memoria seria de 30 bytes.

No se cual es mejor. Sin duda que la primera hace un mejor uso de la memoria, pero no ofrece ventaja si a cada rato tengo que redimensionar mi bloque de memoria. Por otro lado, el segundo caso es mejor a la hora de andar cambiando la cadena muy seguido, pero si reservo tres millones de bytes y uso 5 es ineficiente tambien.

Queria saber que opinan. A mi me gusta mas la primera opcion. Me parece "mas mejor".
IDAsuntoFechaNick 
54502 Re: Memoria y cadena de caracteres. (Resp: 54501)24/12/10 15:43RFOG   
Con la primera opción vas a fragmentar de lo lindo el montículo, pudiendo llegar a tener pocas cadenas pero mucha memoria asignada por los huecos.

El segundo es más "profesional" en el sentido de que es el "allocator" por defecto de la STL. La idea es definir un tamaño medio de cadena y usar ese valor independientemente de que la cadena sea más corta, y si es más larga, usar n veces dicho tamaño. La idea es evitar tantas recolocaciones como sean necesarias.

Un acercamiento híbrido es tener una lista enlazada de memoria reservada. Es decir, tu "allocator" reserva x (muchos) bloques de tamaño fijos y los enlazas como una lista. Ante cada cadena, vas sacando bloques de dicha lista "libre" y los vas metiendo en cada objeto de cadena. Si una cadena necesita dos bloques, pues usas dos bloques. Cuando una cadena libere un bloque (o todos) porque ahora sea más corta, lo reintegras a la lista de libres.

Así evitas fragmentar la memoria si tu trabajo es intensivo (muy intensivo) con cadenas. Por eso es por lo que todas las clases contenedoras de la STL permiten un "allocator" como segundo parámetro: que la memoria la asignes y la trastees tu.

Las variaciones son infinitas, la única limitación es si te piden acceder al puntero de la cadena directamente, entonces tendrás que copiarla a un bloque fijo...

No me preguntes por el tamaño justo de bloque a asignar: si te lo dijera tendría que matarte porque eso pertenece a la los secretos más ocultos de los genios del desarrollo en C/C++... o más bien es algo que sólo se puede determinar estudiando de forma práctica las cadenas típicas que se están usando, y para cada programa (y cada instancia de ese programa) podrían ser diferentes.


Si esta respuesta resuelve tu duda, por favor pulsa en la de este mensaje. Gracias.
IDAsuntoFechaNick 
54503 Re: Memoria y cadena de caracteres. (Resp: 54502)24/12/10 16:17Mr. VB 6   
No entendi muy bien lo de los "allacators". No se que son.


Si esta respuesta resuelve tu duda, por favor pulsa en la de este mensaje. Gracias.
IDAsuntoFechaNick 
54504 Re: Memoria y cadena de caracteres. (Resp: 54503)24/12/10 17:34RFOG   
En C++ un "allocator" es un gestor de asignación y liberación memoria. Cuando tu haces new o malloc, se ejecuta un código del sistema operativo y del runtime de C/C++ que hace que se asigne memoria etc.

En la STL existe un paso más: usar tu propio gestor de memoria (sobre el del sistema operativo) para optimizar los accesos a ella.

Cuando tu haces
list<MiElemento>mi_lista;
realmente estás haciendo:
list<MiElemento,StdAllocator<MiElemento> >mi_lista
ese StdAllocator es una clase que actúa como gestor de memoria, y se puede implementar como otra clase cualquiera de C++.

Con lo de Allocator yo me refería a que tu podías hacer lo mismo que hace la STL, pero a tu modo.

http://en.wikipedia.org/wiki/Allocator_(C%2B%2B)


Dicen que a la enésima va la vencida.
[Editado: RFOG, 24/12/2010 17:34:20]
[RFOG, 24/12/2010 17:35:13]
[RFOG, 24/12/2010 17:36:49]
[RFOG, 24/12/2010 17:37:21]


Si esta respuesta resuelve tu duda, por favor pulsa en la de este mensaje. Gracias.
IDAsuntoFechaNick 
54505 Re: Memoria y cadena de caracteres. (Resp: 54504)24/12/10 21:14Mr. VB 6   
Muchas gracias. Tu ayuda me fue muy util. Te voy a hacer una pregunta que se me ocurrio pero no tiene que ver con este hilo: cuando uno usa un string y lo quiere imprimir, pone directamente el nombre de la instancia de string y listo, es como si hubiera un metodo oculto por defecto que se llama. Hay forma de que yo pueda hacer eso?

Un saludo


Si esta respuesta resuelve tu duda, por favor pulsa en la de este mensaje. Gracias.
IDAsuntoFechaNick 
54506 Re: Memoria y cadena de caracteres. (Resp: 54505)25/12/10 10:26RFOG   
Pues tienes varios acercamientos.

Puedes sobrecargar el operador indirección (*), que no te recomiendo.

Puedes poner un método llamado .t_str() o c_str(), que vienen a ser más o menos nombres estándar, para devolver un "const TCHAR *const" apuntando a la implementación interna de la cadena (y en el caso de que lo hagas con listas tendrías que copiar los pedazos a una sola cadena y luego tener en cuenta que lo has hecho para liberarla luego).

Y puedes sobrecargar los operadores de << y >> para que operen con tu tipo.

http://es.wikibooks.org/wiki/Programación_en_C%2B%2B/Sobrecarga_de_Operadores


Si esta respuesta resuelve tu duda, por favor pulsa en la de este mensaje. Gracias.
IDAsuntoFechaNick 
54507 Re: Memoria y cadena de caracteres. (Resp: 54506)25/12/10 13:03Mr. VB 6   
Super. La sobrecarga de los operadores me encanto. Feliz Navidad y gracias.


Si esta respuesta resuelve tu duda, por favor pulsa en la de este mensaje. Gracias.

 
(c) Guillermo 'guille' Som, 2005-2017  - foros.elGuille v1.0.5.3 (23/Mar/2009 14:50 GMT +1)  - (ASP.NET 2.0 v2.0.50727.8762)
 
Usuarios activos: 58 - App. iniciada: 21/11/2017 10:44:15 GMT - La hora GMT del servidor es: 21/11/2017 12:07:22 GMT