web-dev-qa-db-fra.com

Gestion globale de la mémoire en C++ en pile ou en tas?

Si je déclare une structure de données globalement dans une application C++, est-ce qu'elle consomme de la mémoire de pile ou de la mémoire heap?

Par exemple

struct AAA
{

.../.../.
../../..
}arr[59652323];
67
sameer karjatkar

Étant donné que je n'étais pas satisfait des réponses et que j'espère que le même journaliste karjatkar souhaite apprendre davantage qu'une simple réponse oui/non, c'est parti.

En règle générale, un processus a 5 zones de mémoire différentes allouées

  1. Code - segment de texte
  2. Données initialisées - segment de données
  3. Données non initialisées - segment bss
  4. Tas
  5. Empiler

Si vous voulez vraiment savoir ce qui est sauvegardé, lisez-les et enregistrez-les dans vos favoris:

COMPILER, ASSEMBLER, LINKER AND LOADER: UN BREF HISTORIQUE (consultez le tableau w.5)

Anatomie d'un programme en mémoire

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

129
Milan

Le problème ici est la question. Supposons que vous ayez un petit programme C (++ également, ils gèrent cela de la même manière) 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é sur la pile NOR sur le tas. Au lieu de cela, il est alloué sous forme de données statiques et placé dans son propre segment de mémoire sur la plupart des machines modernes. La chaîne string est également allouée sous forme de données statiques et placée dans un segment en lecture seule dans des machines bien pensées. 
  2. est simplement un pointeur alloué statique; espace pour une adresse, en données statiques.
  3. a le pointeur alloué sur la pile et sera effectivement désalloué lorsque main sera retourné. Comme il s'agit d'une constante, la chaîne est allouée dans l'espace de données statique avec les autres chaînes.
  4. est réellement alloué 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 au fait, les enfants n'essayent pas ça à la maison. malloc a une valeur de retour d'intérêt; vous devriez toujours vérifier la valeur de retour.

Par exemple: 

char * bfr;
if((bfr = malloc(SIZE)) == NULL){
   /* malloc failed OMG */
   exit(-1);
}
27
Charlie Martin

Habituellement, il ne consomme pas non plus. Il essaie de les allouer dans un segment de mémoire qui est susceptible de rester de taille constante pour l'exécution du programme. Il peut s'agir de bss, stack, heap ou data.

14
Tomek Kopczuk

Ni. C'est la section .data.

6
EFraim

La mémoire globale est préallouée dans un bloc de mémoire fixe ou sur le tas, en fonction de la manière dont elle est allouée 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
}

MODIFIER

La question est confuse:Si j'alloue une structure de données de manière globale dans une application C++, consomme-t-elle de la mémoire de pile ou de la mémoire heap?

"allouer"? Cela pourrait vouloir dire beaucoup de choses, y compris appeler malloc (). Cela aurait été différent si la question était "si je déclare et initialise globalement une structure de données". 

Il y a de nombreuses années, alors que les processeurs utilisaient encore des segments de 64 Ko, certains compilateurs étaient suffisamment intelligents pour allouer dynamiquement la mémoire du tas au lieu de réserver un bloc dans le segment .data (en raison de limitations dans l'architecture de la mémoire).

Je suppose que je suis trop vieux ...

5
Philippe Leybaert

Ni déclarer une structure de données globalement dans un C++ ne consomme de la mémoire de tas ou de la pile. En réalité, 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

2
DML

L'objet global lui-même utilise la mémoire que le runtime ou le compilateur lui réserve avant l'exécution de main. Il ne s'agit pas d'un coût d'exécution variable, donc pas de pile ni de tas.

Si le ctor de l'objet alloue de la mémoire, il sera dans le tas et toute allocation ultérieure par l'objet sera une allocation de tas.

Cela dépend de la nature exacte de l'objet global, si c'est un pointeur ou l'objet entier lui-même qui est global. 

0
Rudi Bierach