si j'ai un tableau alloué sur la pile, un pointeur vers le premier élément sera également inférieur> en valeur à un pointeur vers le deuxième élément?
Peu importe "comment" vous allouez le tableau, vous pouvez augmenter ou diminuer le pointeur de pile, mais en conséquence, vous avez un espace d'adressage réservé pour le tableau.
Vous pouvez travailler avec eux de manière normale, puisque l'adresse la plus basse est réservée à l'élément 0.
donc ma question est quelle est la disposition correcte de la mémoire pour un processus sous Linux ?
Vous pouvez le vérifier vous-même. Insérez quelque part dans votre programme quelque chose comme std::cin.get()
pour mettre votre programme en pause.
Exécutez ensuite dans un shell séparé :
ps aux | grep your_program_name
cat /proc/<pid show by grep>/maps
Cela imprime les mappages mémoire de votre processus, où vous pouvez voir où le tas, la pile et d'autres éléments sont placés en mémoire.
À propos de la pile :supposons que vous ayez une machine ordinaire avec Linux et un processeur Intel ou AMD 64 bits. Écrivez ensuite le code suivant :
extern void f(int);
void g(int param)
{
f(param);
}
compilez-le et désassemblez :
g++ -ggdb -c test_my_stack.cc && objdump -S test_my_stack.o
vous pouvez voir (détails sans importance supprimés) :
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
comme vous pouvez le voir dans sub $0x10,%rsp
nous avons réservé de l'espace dans la pile en diminuant (en déplaçant vers le bas) le pointeur de pile.
La première chose qui m'a dérangé avec cette image est que si le tas augmentait de haut en bas, alors si j'allouais un tableau sur le tas, un pointeur vers le deuxième élément ne devrait-il pas être plus petit en valeur int qu'un pointeur vers le premier élément ? ce qui serait déroutant
Pas du tout. Disons que vous allouez un tableau de 10 octets à partir d'un pool de mémoire qui augmente de haut en bas. Tout ce que l'allocateur aurait à faire est de décrémenter le "bas" de ce pool de mémoire de 10, puis d'utiliser cette valeur comme début du tableau alloué. Le tableau se terminerait alors à l'ancien "bas". L'arithmétique de pointeur fonctionnerait toujours comme prévu, mais vous "évolueriez" vers une adresse basse.