Question

En C ++, le spécificateur de classe de stockage static alloue de la mémoire à partir de la zone de données. Qu'est-ce que " zone de données " moyen?

Était-ce utile?

La solution

En plus de ce que Konrad a dit, déclarer une variable comme statique signifie essentiellement que sa mémoire est allouée avec le programme au fur et à mesure de son chargement, et non sur le tas ou la pile. Historiquement, l'utilisation de seules variables statiques dans des applications critiques signifiait que l'empreinte mémoire de l'application ne changerait pas au moment de l'exécution et qu'il était donc moins susceptible d'échouer en raison de ressources limitées. Je ne sais pas si cela est toujours vrai des systèmes d'exploitation modernes.

Si vous demandez à votre compilateur de générer un fichier map dans le cadre de sa sortie, vous pouvez consulter le contenu de toutes les sections, y compris les données.

Autres conseils

Je ne connais pas bien le terme "zone de données" & # 8221; mais la mémoire est souvent divisée en & # 8220; section de code & # 8221; et & # 8220; section de données & # 8221 ;. Le code réside dans le premier, les données dans le second. Je présume que c'est ce que nous voulions dire ici.

Classiquement, il n'y a pas de distinction entre les deux. Cependant, de nombreux systèmes d'exploitation modernes peuvent interdire l'exécution de code dans le segment de données (à condition que le CPU prenne en charge cette distinction). Cela passe parfois par le slogan de & # 8220; le drapeau NX & # 8221 ;, comme dans & # 8220; pas d'exécution & # 8221; et peut prévenir efficacement certains cas d’injection de code malveillant.

/ EDIT: notez que la norme C ++ ne mentionne pas de zone de données & # 8220; & # 8221;.

Les noms des zones varient en fonction de la plate-forme, du compilateur et de l'éditeur de liens.

En général, il y a:

  • texte du programme: l'espace de code exécutable.
  • constantes: constantes non exécutables.
  • pile: la pile.
  • bss: largement "statique" en termes C / C ++. "Bloc démarré par symbole"
  • data: globales non initialisées
  • heap: stockage alloué à l'exécution.

Dans ce cas, la documentation en question utilise le nom "zone de données". pour ce qu'on appelle traditionnellement le segment bss.

En langage C, le spécificateur de classe de stockage "statique". signifie la mémoire qui existe pour la durée de vie du programme et qui est initialisée à zéro ou à la valeur de l'initialiseur. Dans l'exemple:

static int s_value_one;
static int s_value_two = 123;

La valeur de s_value_one est garantie à zéro et la valeur de s_value_type est 123 au point de la première instruction de main (). La façon dont cela se vérifie est un problème de mise en œuvre.

Ce que Konrad a dit.

J'aimerais ajouter qu'il existe encore des processeurs qui ne peuvent pas lire les données si elles sont placées dans la section de code et vice versa. Celles-ci étaient plus courantes il y a des décennies, mais elles sont toujours vivantes dans le monde intégré.

En résumé, l'éditeur de liens regroupe simplement des symboles de même nature. Sur le PC, vous avez souvent encore plus que de simples zones de code et de données. Vous trouverez également des zones pour les données non initialisées, des données en lecture seule et d'autres éléments dépendants du système d'exploitation.

Il existe de nombreux endroits où les données peuvent se retrouver. Habituellement, les variables locales sont allouées sur la pile et vous pouvez allouer des éléments sur le tas en utilisant malloc (ou la version par défaut de 'new'). Cependant, les données statiques sont généralement allouées au démarrage de votre programme et peuvent se retrouver n'importe où: l'emplacement exact du compilateur, du système d'exploitation et du format de l'exécutable.

L'exécutable contient de nombreuses informations.

Un exécutable contient de nombreux types / classes de données stockés dans son fichier physique.

par exemple sont

  1. Instructions de code exécutable
  2. Ressources
  3. Informations sur les dépendances (de la dll dépendante de ce binaire)
  4. Les symboles exportés à partir de ce binaire

etc

Il doit y avoir un moyen d'organiser

Toutes ces informations dans le format de fichier .exe, de sorte que le système d'exploitation puisse facilement trouver toutes les informations, charger l'exécutable et faire fonctionner les choses. À cette fin, un format binaire commun (créé par M $ of-course) appelé PE (exécutable portable) est utilisé dans le monde de Windows. Toutes les informations que je viens d'énumérer (et bien d'autres) sont décrites en détail dans différentes sections du binaire.

Section .data

Une de ces sections est la section .data. La section .data contient toutes les données globales et statiques initialisées, tandis que la section .bss contient les données globales non initialisées.

Pourquoi avez-vous besoin d'une section distincte pour les globals?

Eh bien, un global se comporte comme un global, car il est créé dans une zone de mémoire qui existe pour la durée de vie d’un programme et n’est pas une structure de données temporaire comme une pile qui pourrait être remplacée / réutilisée. (comme les variables auto normales).

Compilateur

Par conséquent, ces variables doivent être affectées à une adresse permanente du tas, qui ne peut malheureusement pas être connue au moment de la compilation. Le compilateur place donc toutes les variables globales et statiques dans cette section .data / .bss, et les instructions faisant référence à ces variables font référence à ces adresses relativement permanentes dans le fichier .data / .bss.

Éditeur de liens

Lorsque l'éditeur de liens charge l'exécutable dans le monde réel, il décide où ces sections doivent être placées et crée des FIX UP pour ces adresses temporaires de manière à ce que les instructions faisant référence aux globales fassent référence aux adresses virtuelles désormais réelles dans les programmes. Mémoire.

Maintenant, vous savez quelle est la section / zone .data et pourquoi il est nécessaire d'allouer de l'espace aux globals dans cette zone et comment cela aide le programme en temps réel. Le format PE sur Google, l’éditeur de liens et la section .data, etc. vous permettraient de trouver les liens.

Je pense que "zone de données" fait référence au tas, alors que les variables locales seraient généralement situées sur la pile.

Ou cela signifie que la mémoire allouée pour cette variable se trouve dans la section .data de l'exécutable, mais que cela serait spécifique à Windows et au format PE.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top