si tengo una matriz asignada en la pila, ¿un puntero al primer elemento también tendrá un valor más bajo que un puntero al segundo elemento?
No es importante "cómo" asigna la matriz, puede aumentar o disminuir el puntero de la pila, pero como resultado tiene espacio de direcciones reservado para la matriz.
Puede trabajar con ellos de forma normal, ya que la dirección más baja está reservada para el elemento 0.
entonces mi pregunta es ¿cuál es el diseño de memoria correcto para un proceso en Linux?
Puedes comprobarlo tú mismo. Inserte en algún lugar de su programa algo como std::cin.get()
para pausar su programa.
Luego ejecute en un shell separado:
ps aux | grep your_program_name
cat /proc/<pid show by grep>/maps
Esto imprime las asignaciones de memoria de su proceso, donde puede ver dónde se colocan el montón, la pila y otras cosas en la memoria.
Acerca de la pila:supongamos que tiene una máquina ordinaria con Linux y CPU Intel o AMD de 64 bits. Luego escribe el siguiente código:
extern void f(int);
void g(int param)
{
f(param);
}
compilarlo y desensamblarlo:
g++ -ggdb -c test_my_stack.cc && objdump -S test_my_stack.o
puede ver (se eliminaron los detalles sin importancia):
void g(int param)
{
0: 55 push %rbp
1: 48 89 e5 mov %rsp,%rbp
4: 48 83 ec 10 sub $0x10,%rsp
8: 89 7d fc mov %edi,-0x4(%rbp)
f(param);
b: 8b 45 fc mov -0x4(%rbp),%eax
como puedes ver en sub $0x10,%rsp
reservamos espacio en la pila disminuyendo (moviendo hacia abajo) el puntero de la pila.
Lo primero que me molestó con esa imagen es que si el montón creció de mayor a menor, si asigné una matriz en el montón, ¿no debería un puntero al segundo elemento ser más pequeño en valor int que un puntero al primer elemento? lo cual sería confuso
De nada. Supongamos que asigna una matriz de 10 bytes de un grupo de memoria que crece de mayor a menor. Todo lo que el asignador tendría que hacer es disminuir el "fondo" de ese grupo de memoria en 10, luego usar ese valor como el comienzo de la matriz asignada. La matriz luego terminaría en el "fondo" anterior. La aritmética de punteros seguiría funcionando como se esperaba, pero "crecería" hacia una dirección baja.