Il existe (grosso modo) deux types d'objets W.R.T. leur gestion de la mémoire:
- objets Un peut être entièrement construit lors de la compilation
- Un objet ne peut être entièrement construit en utilisant des informations qui ne sont pas disponibles qu'après le programme est exécuté
Par exemple , tout objet de type constexpr
peut être entièrement évalué et construit pendant la compilation et peut donc être placé dans un segment de données de mémoire en tant qu'optimisation (du point de vue puriste, il est valide, mais loin d'être optimal, de construire de tels objets pendant l'exécution Mais cela va gaspiller les cycles CPU et faire l'initialisation/démarrage plus long).
Voici quelques exemples de ces objets:
const char * const helloWorld = "Hello, world!";
struct TSilly{
TSilly(int _i = 0) : i(_i) {}
int i;
};
const TSilly silly1;
const TSilly silly2(42);
TSilly silly3; // doesn't have to be constexpr to qualify for static allocation.
// This one you can declare as /*extern TSilly silly3;*/ in
// header file and access from other compilation units
static TSilly silly4; // can be local to compilation unit, too
int main()
{
return 0;
}
Tous les autres objets devraient attendre jusqu'à ce que l'exécution à construire.
Des exemples de tels objets:
const char * exeName1; // statically allocated by compiler
int main(int argc, char **argv)
{
exeName1 = argv[0]; // now points to a string
// buffer is allocated in free storage (heap) bu variable itself is on stack
char * exeName2 = new char[strlen(argv[0] + 1];
strcpy(exeName2, argv[0]); // now contains a COPY of a string
char exeName3[1024]; // likely allocated on stack, be careful with that as stack space is limited
strncpy(exeName3, argv[0], 1024); // will COPY at most 1023 characters from a string
delete [] exeName2; // don't forget to clean up
// exename3 will be auto-cleaned when we exit the function
return 0;
}
Comme vous pouvez le voir un objet en C++ sera mis dans un segment de données ou dans une mémoire libre (tas) en fonction de sa durée de vie.
Seuls les objets alloués dynamiquement sont garantis d'être mis en mémoire libre. Je ne pense pas que la spécification fasse une promesse d'utilisation de segments de données pour objets alloués statiquement - il appartient au compilateur d'effectuer et d'utiliser cette optimisation.
Pour plus d'informations, voir "Classes de stockage C++".
Il existe de nombreux sujets avancés sur la gestion de la mémoire que vous voudrez peut-être examiner. Le plus pertinent à cette discussion est probablement le constructeur in-place qui vous permet d'avoir un objet d'exécution construit dans une mémoire allouée dans le segment de données de l'exécutable.
'foo' et' bar' ont une durée de stockage dynamique et sont stockés dans * freestore *. La spécification de langage C++ ne mentionne pas * "heap" * comme stockage. 'obj1' et' obj2' sont des ** références **. Ce sont des alias pour les objets existants et ils n'existent que pendant la compilation (comme toutes les variables). Ils (généralement) ne sont pas reflétés dans l'image exécutable, ou la mémoire au moment de l'exécution. – IInspectable
Référence: http://stackoverflow.com/questions/10157122/object-creation-on-the-stack-heap –