Aucune de ces notions n'existent en C++ (i.e. dans la norme). Le C++ parle uniquement de la durée de vie des variables limitée au scope (qui correspondra à la pile) ou géré par le développeur avec new/delete (qui correspond au tas) ou sur la durée du programme.
Ce sont des notions liées à l'O.S. Le compilateur se contente de traduire les exigences du langage dans l'architecture de l'O.S. cible.
Maintenant, je ne connais pas d'O.S. qui n'aie pas une pile et un tas...
C'est pas tout à fait ça. Le langage C++ ne parle ni de segment code, ni de pile ni de tas. Tout ça c'est du ressort de l'O.S. Le compilateur traduit les instructions du langage C++ vers les mécanismes et l'architecture de l'O.S. cible. Par exemple, quand tu déclares une variable locale, le compilateur pour windows génère les instructions nécessaires pour allouer un espace suffisant et correctement aligné sur la pile et va adresser cet espace lorsque la variable est accédée. Lorsque tu déclares un tableau, la norme indique que les éléments doivent être contigues en mémoire. Cela signifie que &T[i]==T+i==reinterpret_cast<unsigned char*>(T) + i*sizeof(T[0]).
A charge pour le compilateur de s'assurer que ce contrat sera rempli dans le programme généré. Mais même ceci est abstrait par le mécanisme de mémoire virtuelle. Si le tas est suffisamment grand, le process alloue le bloc mémoire et les adresses sont contigues. A charge de l'infrastructure de faire le mapping nécessaire entre mémoire virtuelle et mémoire physique pour que ça ait l'air de correspondre. Si physiquement et virtuellement cela correspond, et ben, le mapping est juste une translation. Sinon, la MMU(?) en traduisant l'adresse virtuelle ira chercher le bon bloc.
[EDIT] : j'ai lu la discussion que tu mentionnes.