elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Usando Git para manipular el directorio de trabajo, el índice y commits (segunda parte)


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  [C++] (Consulta) ¿std::string guarda la cadena en el heap o en la pila?
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: [C++] (Consulta) ¿std::string guarda la cadena en el heap o en la pila?  (Leído 2,806 veces)
class_OpenGL


Desconectado Desconectado

Mensajes: 437

Si usas Direct3D, no eres mi amigo :P


Ver Perfil
[C++] (Consulta) ¿std::string guarda la cadena en el heap o en la pila?
« en: 10 Agosto 2016, 15:30 pm »

Hola, muy buenas. La duda que tengo viene de que yo creía que una cadena en C++ (con std::string) se almacenaba en el heap (en el montón), pero con el código que voy a mostrar ahora parece que se almacena en la pila. Por eso pregunto, ¿std::string guarda la cadena en el heap o en la pila?

Código por el que pienso que una cadena se almacena en la pila
Código
  1. #include <iostream>
  2. #include <string>
  3. #include <memory>
  4.  
  5. int main() {
  6. std::string cadena = "Hola";
  7. const char *cadena_c = (const char *)(addressof(cadena));
  8. unsigned int i = 0;
  9.  
  10. std::cout << std::hex;
  11. for(i = 0; i < sizeof(cadena); i++)
  12. std::cout << (unsigned int)cadena_c[i] << " - " << cadena_c[i] << std::endl;
  13.  
  14. return 0;
  15. }

Esta es la salida que obtengo con MinGW-w64 (resultado similar con g++ de Ubuntu):
Código:
10 - ►
fffffffe - ■
23 - #
0 -
0 -
0 -
0 -
0 -
4 - ♦
0 -
0 -
0 -
0 -
0 -
0 -
0 -
48 - H
6f - o
6c - l
61 - a
0 -
ffffffff -  
ffffffff -  
ffffffff -  
fffffff5 - §
18 - ↑
40 - @
0 -
0 -
0 -
0 -
0 -

Como ven, se ve claramente que está en la pila (al menos yo lo veo así, quizás me equivoque).

Si se almacena en la pila, es raro porque según la página de cplusplus, incluso el constructor lanza una excepción si falla a la hora de asignar memoria. Que yo sepa, el stack ya lo tenemos asignado...

Código:
A bad_alloc exception is thrown if the function fails when attempting to allocate storage.

Espero que me puedan aclarar la duda :D Muchas gracias de antemano


En línea

Programador aficionado. Me quiero centrar en programar videojuegos. La API que uso para crearlos es OpenGL
AlbertoBSD
Programador y
Moderador Global
***
Desconectado Desconectado

Mensajes: 3.696


🏴 Libertad!!!!!


Ver Perfil WWW
Re: [C++] (Consulta) ¿std::string guarda la cadena en el heap o en la pila?
« Respuesta #1 en: 10 Agosto 2016, 15:38 pm »

En teoria es el heap para que pueda crecer de forma arbitraria en tiempo de ejecución.

Cuando trabajas con estos objetos el area de almacenamiento  es conocida como FreeStore, que es basicamente el heap llamado de otra forma.

¿Como determinas si es la Pila o es el heap cuanfo imprimes en pantalla el contenido?

Lo que podrias hacer es impimir la direccion donde esta almacenada esa cadena y la direccion de una variable en la pila, junto con una que realmente esta en el heap (malloc/new)

Saludos!


« Última modificación: 10 Agosto 2016, 15:39 pm por AlbertoBSD » En línea

class_OpenGL


Desconectado Desconectado

Mensajes: 437

Si usas Direct3D, no eres mi amigo :P


Ver Perfil
Re: [C++] (Consulta) ¿std::string guarda la cadena en el heap o en la pila?
« Respuesta #2 en: 10 Agosto 2016, 16:08 pm »

He usado el siguiente código, y creo que no cabe duda que se almacena en la pila, pero eso me genera muchas preguntas.

Código
  1. #include <iostream>
  2. #include <string>
  3. #include <memory>
  4.  
  5. int main() {
  6. unsigned int variable = 0;
  7. std::string cadena = "Hola";
  8. char *caracter = new char;
  9.  
  10. std::cout << "Direccion de variable local: " << &variable << std::endl;
  11. std::cout << "Direccion de cadena: " << (void *)cadena.c_str() << std::endl;
  12. std::cout << "Direccion de un byte en el heap: " << (void *)caracter << std::endl;
  13.  
  14. delete caracter;
  15. return 0;
  16. }

Salida obtenida:
Código:
Direccion de variable local: 0x23fe30
Direccion de cadena: 0x23fe20
Direccion de un byte en el heap: 0x4b18f0

Lo deduzco por dos razones:
1º- La dirección de la variable local y la dirección de la cadena siempre están juntas con ese espacio de bytes.

2º- Siempre que ejecuto el programa de nuevo, la pila parece permanecer en la misma dirección (la dirección de la variable local y de la cadena permanecen en un rango limitado) mientras que la dirección de la variable en el heap cambia constantemente.

Si confirmo que se guarda en la pila, entonces preguntaré mis dudas
En línea

Programador aficionado. Me quiero centrar en programar videojuegos. La API que uso para crearlos es OpenGL
AlbertoBSD
Programador y
Moderador Global
***
Desconectado Desconectado

Mensajes: 3.696


🏴 Libertad!!!!!


Ver Perfil WWW
Re: [C++] (Consulta) ¿std::string guarda la cadena en el heap o en la pila?
« Respuesta #3 en: 10 Agosto 2016, 16:13 pm »

Que raro agregale este:


Código
  1. std::cout << "Direccion de cadena: " << (void *)cadena << std::endl;

Ya que llegue a mi Computadora lo valido.

Saludos
En línea

class_OpenGL


Desconectado Desconectado

Mensajes: 437

Si usas Direct3D, no eres mi amigo :P


Ver Perfil
Re: [C++] (Consulta) ¿std::string guarda la cadena en el heap o en la pila?
« Respuesta #4 en: 10 Agosto 2016, 16:16 pm »

No lo veo necesario, pues he sacado la dirección de una variable LOCAL, que se almacena en la pila. En cualquier caso, para que no quede ningún tipo de duda, lo pondré:

Código:
Direccion de variable local: 0x23fe30
Direccion del objeto cadena: 0x23fe10
Direccion de cadena: 0x23fe20
Direccion de un byte en el heap: 0x3518f0
En línea

Programador aficionado. Me quiero centrar en programar videojuegos. La API que uso para crearlos es OpenGL
class_OpenGL


Desconectado Desconectado

Mensajes: 437

Si usas Direct3D, no eres mi amigo :P


Ver Perfil
Re: [C++] (Consulta) ¿std::string guarda la cadena en el heap o en la pila?
« Respuesta #5 en: 10 Agosto 2016, 16:37 pm »

Creo que ya lo entiendo. Se guarda tanto en el stack como en la pila. Me explico, en primera instancia, si no hay problemas, la cadena se guarda en la pila, pero cuando adjuntamos nuevos datos, este pasa a estar en memoria dinámica. Código que he utilizado:

Código
  1. #include <iostream>
  2. #include <string>
  3.  
  4. int main() {
  5. std::string cadena = "Hola";
  6.  
  7. std::cout << "Direccion en main de objeto: " << &cadena << std::endl;
  8. std::cout << "Direccion en main de cadena: " << (void *)cadena.c_str() << std::endl;
  9.  
  10. cadena.append(". Esto es una adjunción dentro de una función");
  11.  
  12. std::cout << "Direccion despues de append: " << (void *)cadena.c_str() << std::endl;
  13.  
  14. return 0;
  15. }

Direcciones obtenidas:
Código:
Direccion en main de objeto: 0x23fe10
Direccion en main de cadena: 0x23fe20
Direccion despues de append: 0x8418f0
« Última modificación: 10 Agosto 2016, 16:39 pm por class_OpenGL » En línea

Programador aficionado. Me quiero centrar en programar videojuegos. La API que uso para crearlos es OpenGL
ivancea96


Desconectado Desconectado

Mensajes: 3.412


ASMático


Ver Perfil WWW
Re: [C++] (Consulta) ¿std::string guarda la cadena en el heap o en la pila?
« Respuesta #6 en: 10 Agosto 2016, 17:05 pm »

string tiene un array de tamaño fijo donde almacenará cadenas de hasta un tamaño límite, para evitar trabajar continuamente con memoria dinámica.

En el caso de GCC 5.2, es de 16 bytes. Esto lo compruebas fácilmente con un código como:

Código
  1. #include <iostream>
  2. #include <string>
  3.  
  4. using namespace std;
  5.  
  6. int main() {
  7. string str1(15, ' ');
  8. string str2(16, ' ');
  9. cout << (void*)&str1 << endl;
  10. cout << (void*)str1.data() << endl;
  11. cout << (void*)str1.get_allocator().allocate(1, &str1) << endl << endl;
  12. cout << (void*)&str2 << endl;
  13. cout << (void*)str2.data() << endl;
  14. cout << (void*)str2.get_allocator().allocate(1, &str1) << endl;
  15. }
En línea

class_OpenGL


Desconectado Desconectado

Mensajes: 437

Si usas Direct3D, no eres mi amigo :P


Ver Perfil
Re: [C++] (Consulta) ¿std::string guarda la cadena en el heap o en la pila?
« Respuesta #7 en: 10 Agosto 2016, 17:10 pm »

Ahh. Vale. Eso ya me cuadra más. ¡¡Muchas gracias por resolver la duda!!
En línea

Programador aficionado. Me quiero centrar en programar videojuegos. La API que uso para crearlos es OpenGL
Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
se corta la cadena string
Programación Visual Basic
rembolso 2 2,535 Último mensaje 1 Mayo 2011, 06:13 am
por rembolso
Cadena de texto a url string
PHP
[u]nsigned 5 4,436 Último mensaje 30 Julio 2011, 06:53 am
por WHK
Duda: Crear una pila contando palabras encontradas en un string
PHP
Darkkz 2 2,344 Último mensaje 10 Septiembre 2011, 23:35 pm
por Darkkz
Guarda basura al leer string desde un fichero.[RESUELTO]
Programación C/C++
utz 5 4,632 Último mensaje 14 Mayo 2012, 03:36 am
por durasno
No guarda la cadena dentro del vector
Programación C/C++
7emiliosk8 9 2,776 Último mensaje 10 Febrero 2017, 16:35 pm
por dato000
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines