Chaque objet en C++ a deux périodes de temps imbriquées qui y sont associés: durée de stockage et vie. La durée de stockage est la période pendant laquelle la mémoire brute occupée par l'objet est allouée. Durée de vie est la période entre la construction et la destruction d'un objet réel dans cette mémoire. (Pour les objets de construction de type POD, la destruction n'a pas d'importance ou n'est pas applicable, donc leur durée de vie correspond à leur durée de stockage).
Lorsque quelqu'un dit "alloué", ils se réfèrent généralement à durée de stockage. Le langage ne spécifie pas exactement quand la durée de stockage de l'objet commence. Il est suffisant d'exiger que commence à un certain moment avant que commence la vie de l'objet. Pour cette raison, en général, un objet statique défini dans une fonction peut ne jamais commencer sa durée de vie et, théoriquement, sa durée de stockage ne doit pas non plus commencer. Donc, en théorie, peut-être même pas "alloué". En pratique cependant, tous les objets ayant une durée de stockage statique ("globals", statique locale, etc.) sont normalement traités de la même manière: ils reçoivent une quantité de stockage spécifique au début, au démarrage du programme.
Comme une note supplémentaire, si un objet local avec une durée de stockage statique nécessite une initialisation non trivial, cette initialisation est effectuée lorsque le contrôle passe au-dessus de la définition pour la première fois. Ainsi, dans cet exemple
void foo() {
static int *p = new int[100];
}
le tableau dynamique ne sera jamais alloué si la fonction n'est jamais appelée. Et il ne sera alloué qu'une seule fois si la fonction est appelée. Cela ne ressemble pas à ce que vous demandez, mais je le mentionne au cas où.
C'est une bonne raison de placer des fonctions dans une unité de traduction séparée; de sorte que les fonctions jamais appelées puissent être supprimées au moment de la construction. :-) –
Vous devez faire la distinction entre __allocation__ et __initialization__.Si une fonction non appelée n'est pas supprimée par l'éditeur de liens, il est probable que la mémoire de cette variable soit _allocated_, même si elle n'est jamais _initialized_. – sbi
@Thomas: il y a une bonne raison de choisir un compilateur qui n'a pas besoin de beaucoup de prise en main. Ce n'est pas sorcier de savoir si 'void foo()' est appelé. – MSalters