2009-07-23 5 views
65

Si je déclare globalement une structure de données dans une application C++, consomme-t-elle de la mémoire de pile ou de la mémoire heap?Gestion globale de la mémoire en C++ en pile ou en tas?

Pour exemple

struct AAA 
{ 

.../.../. 
../../.. 
}arr[59652323]; 
+1

aussi, quelle est la différence entre une variable globale et une variable statique (dans une fonction). Ils doivent vivre pour la vie du programme ... – user128026

+0

accepté mais leur différence entre accessibilité –

+0

@dspinozzi: les constructeurs de variables globales sont appelés avant main(), mais les constructeurs de variables statiques sont appelés la première fois la fonction est appelé. Les deux types de variables sont généralement stockés dans les mêmes parties de la mémoire - je pense que GCC les place dans la section .data. – Neil

Répondre

123

Depuis que je suis pas satisfait des réponses, et espère que le karjatkar de Sameer veut en savoir plus qu'un simple réponse oui/non, ici vous allez.

Généralement, un processus a 5 différentes zones de mémoire allouée

  1. Code - segment de texte
  2. données initialisée - segment de données
  3. données non initialisée - le segment bss
  4. Heap
  5. Stack

Si vous voulez vraiment apprendre ce qui est sauvé où puis lire et mettre en signet celles-ci:

COMPILER, ASSEMBLER, LINKER AND LOADER: A BRIEF STORY (regardez le tableau W.5)

Anatomy of a Program in Memory

alt text http://www.tenouk.com/ModuleW_files/ccompilerlinker006.png

+0

Cela signifie-t-il que les données non initialisées - bss et les données Initialisées - font partie du tas? –

+0

Non, ils ne font pas partie du tas, ils sont dans des zones différentes comme cela a été écrit dans ma réponse (les 5 zones différentes). Le tas et la pile occupent la mémoire virtuelle au-dessus des segments de texte et de données. – Milan

+6

Le point important est que les segments bss et data sont alloués lors du premier chargement du programme en mémoire, et que leur taille ne change pas pendant son exécution. Le contenu du tas est par contre volatil et change tout au long de la course, à mesure que les opérations de mémoire dynamique sont effectuées. – quark

6

Ni. C'est la section .data.

+0

Cela dépend si la mémoire globale a été allouée en ligne ou alllocated dynamiquement à partir de l'application –

+1

Si une mémoire a été allouée dynamiquement, elle n'est pas globale (dans un sens de variable globale) – EFraim

+0

discutable :) –

5

mémoire globale est pré-alloué dans un bloc de mémoire fixe, ou sur le tas, selon la façon dont il est attribué par votre application:

byte x[10]; // pre-allocated by the compiler in some fixed memory block 
byte *y 

main() 
{ 
    y = malloc(10); // allocated on the heap 
} 

EDIT:

La question est source de confusion: Si j'alloue une structure de données globalement dans une application C++, consomme-t-elle de la mémoire de pile ou de la mémoire de tas?

"allouer"? Cela pourrait signifier beaucoup de choses, y compris l'appel de malloc(). Cela aurait été différent si la question était "si je déclare et initialise une structure de données globalement". Il y a de nombreuses années, lorsque les CPU utilisaient encore des segments 64K, certains compilateurs étaient assez intelligents pour allouer dynamiquement de la mémoire depuis le tas au lieu de réserver un bloc dans le segment .data (en raison des limitations de l'architecture mémoire).

Je crois que je suis trop vieux ....

+0

C'est de la sémantique. Je suppose que cela vaut une downvote –

+0

Il sais "alloué sur le tas" et c'est très correct. À moins que cette question soit marquée «novice» ou «débutant», cela devrait être un rappel suffisant de ce qui se passe. –

+0

@Don: Non. La chose globale est le pointeur, et non la mémoire vers laquelle il pointe. Vous pouvez gérer la mémoire comme vous le souhaitez. Ni il est là pour rester pour toute la course. Vous pouvez même le pointer à la pile parfois. – EFraim

-3

Si vous allouez explicitement la mémoire vous-même par une nouvelle ou malloc, il sera alloué en tas. Si le compilateur alloue la mémoire, alors il sera alloué sur la pile.

+0

la mémoire globale n'est jamais allouée sur la pile. La pile n'est utilisée que pour les variables et paramètres locaux –

+0

Les variables de pile sont "détruites" lorsque la fonction renvoie – user128026

13

Habituellement, il ne consomme ni l'un ni l'autre. Il tente de les allouer dans un segment de mémoire susceptible de rester de taille constante pour l'exécution du programme. Cela peut être bss, stack, heap ou data.

+0

En éditant le fichier boot.ini, nous pouvons étendre la mémoire virtuelle à 3GB. Comme sage est-il un réglage pour le segment de la mémoire? –

+0

Cela serait inutile, car la taille de la mémoire allouée statiquement ne peut jamais changer –

-1

Les variables globales résident sur le tas. il s'agit d'un cas particulier car ils vivent toute la vie du programme

0

L'objet global lui-même récupère la mémoire que le moteur d'exécution ou le compilateur lui réserve avant l'exécution de main, ce n'est pas un coût d'exécution variable donc ni pile ni tas.

Si le ctor de l'objet alloue de la mémoire, il sera dans le tas et toutes les allocations suivantes de l'objet seront des allocations de tas.

Cela dépend de la nature exacte de l'objet global, s'il s'agit d'un pointeur ou de l'ensemble de l'objet global lui-même.

26

Le problème ici est la question. Supposons que vous avez un petit programme C (++ ainsi, ils gèrent ce même) comme ceci:

/* my.c */ 

char * str = "Your dog has fleas."; /* 1 */ 
char * buf0 ;       /* 2 */ 

int main(){ 
    char * str2 = "Don't make fun of my dog." ; /* 3 */ 
    static char * str3 = str;   /* 4 */ 
    char * buf1 ;      /* 5 */ 
    buf0 = malloc(BUFSIZ);   /* 6 */ 
    buf1 = malloc(BUFSIZ);   /* 7 */ 

    return 0; 
} 
  1. Ce n'est ni allouée sur la pile ni sur le tas. Au lieu de cela, il est alloué en tant que données statiques, et mis dans son propre segment de mémoire sur la plupart des machines modernes. La chaîne réelle est également allouée en tant que données statiques et placée dans un segment en lecture seule dans les machines correctes.
  2. est simplement un pointeur statique alloué; pièce pour une adresse, en données statiques.
  3. a le pointeur alloué sur la pile et sera effectivement désalloué lorsque main retourne. La chaîne, puisque c'est une constante, est allouée dans l'espace de données statiques avec les autres chaînes.
  4. est réellement allouée exactement comme en 2. Le mot clé static vous indique qu'il ne doit pas être alloué sur la pile.
  5. ... mais buf1 est sur la pile, et
  6. ... l'espace tampon mallocéé est sur le tas.
  7. Et en passant, les enfants n'essaient pas cela à la maison. malloc a une valeur de retour d'intérêt; vous devez toujours vérifier la valeur de retour.

Par exemple:

char * bfr; 
if((bfr = malloc(SIZE)) == NULL){ 
    /* malloc failed OMG */ 
    exit(-1); 
} 
+0

L'espace tampon mallocé n'a rien à voir avec les variables globales. Seuls les pointeurs sont globaux. S'il vous plaît ne pas confondre les gens plus loin. – EFraim

+7

Oh, ne sois pas stupide. Le questionneur n'était clairement pas clair sur ce qui allait où, alors j'ai écrit une réponse qui visait à améliorer sa compréhension. –

2

Ni la déclaration d'une structure de données globalement dans un C++ consomme tas ou mémoire de pile. En fait, les variables globales sont généralement allouées dans un segment de données dont la taille reste inchangée pendant tout le programme. Les piles et les tas sont généralement utilisés pour les variables créées et détruites lors de l'exécution du programme.

Program Memory Space

Questions connexes