2009-09-28 4 views
2

En C++, est-il possible de forcer le compilateur à disposer une série d'objets globaux ou statiques dans une position de mémoire séquentielle? Ou est-ce le comportement par défaut? Par exemple, si je vous écris ...Organisation séquentielle des objets globaux/statiques en mémoire

MyClass g_first (“first”); 
MyClass g_second (“second”); 
MyClass g_third (“third”); 

... seront ces objets occupent un morceau continu de la mémoire, ou est le compilateur libre de les placer partout dans l'espace d'adressage?

+0

comme Adam dit - mais pourquoi avez-vous besoin de savoir? – peterchen

+0

Ditto: Qu'est-ce que vous essayez d'accomplir en faisant cela? –

Répondre

3

Le compilateur peut faire ce qu'il veut quand il s'agit de placer des objets statiques en mémoire; Si vous voulez un meilleur contrôle sur la façon dont vos globals sont placés, vous devriez envisager d'écrire un struct qui les englobe tous. Cela garantira que vos objets seront tous emballés dans un ordre séquentiel et prévisible.

+0

Juste un suivi: si tous les objets globaux qui vous intéressent sont du même type, vous pouvez simplement utiliser un tableau pour les stocker tous. Cela assurera également un stockage contigu. –

0

Placer des variables spécifiques ou un groupe de variables dans un segment de mémoire n'est pas une fonctionnalité standard du compilateur.

Mais certains compilateurs prennent en charge des méthodes spéciales pour cela. Surtout dans les systèmes embarqués. Par exemple, dans Keil, je suppose que vous avez à l'opérateur pour placer une variable particulière.

0

La manière de forcer des objets à être dans une mémoire contiguë est de les placer dans un tableau.

Si vous utilisez le type de tableau intégré, la seule façon dont ils peuvent être initialisés est leurs constructeurs par défaut (bien que vous pouvez modifier leurs valeurs plus tard):

MyClass my_globals[3]; 

Si vous utilisez un tableau dynamique (appelé std::vector en C++), vous êtes plus flexible:

namespace { 
    typedef std::vector<MyClass> my_globals_type; 

    my_globals_type init_my_globals() 
    { 
    my_globals_type globals; 
    globals.push_back(MyClass(“first”)); 
    globals.push_back(MyClass(“second”)); 
    globals.push_back(MyClass(“third”)); 
    return globals; 
    } 

    my_globals_type my_globals = init_my_globals(); 
} 

Notez que les variables globales sont généralement mal vues. Et à juste titre.

+0

Les variables globales peuvent être changées en membres de classe statiques, ce qui entoure au moins un nom de classe autour d'eux. –

+0

Et qu'est-ce que cela vous apporte? – sbi

Questions connexes