Déclarer un vecteur comme variable globale en C ++
Est-ce une bonne pratique de déclarer un vecteur global en C++?
C'est ce que j'ai fait.
#include <vector>
std::vector<int> vec;
Mon programme compile correctement, mais je ne suis pas sûr que cela pourrait conduire à une exécution
erreur dans certaines circonstances. Selon ma compréhension, la mémoire pour une variable globale sera attribuée au moment de la compilation, et le compilateur peut réserver une quantité limitée de mémoire à laquelle ce vecteur peut s'étendre. Au moment de frapper cette limite, ce qui est écrit peut manger dans la mémoire utilisée par une autre variable.
Veuillez en informer.
source d'informationauteur cpp_noname | 2011-09-26
Vous devez vous connecter pour publier un commentaire.
C'est sécuritaire de le faire; la de stockage pour les
vec
variable sera allouée de manière statique et par défaut du constructeur sera appelé à un certain moment (quand exactement dans le contexte de l'ensemble de votre programme n'est pas strictement défini, comme l'ordre de l'initialisation à travers les unités de traduction n'est pas strictement défini).Le vecteur lui-même attribue à son stockage sur le tas, donc il n'y aura pas de limitations imposées à son expansion qui serait différent si vous instancié le vecteur comme une variable locale: vous êtes fondamentalement va être limité par la quantité de mémoire que vous pouvez allouer de manière contiguë à points dans le temps du vecteur doit organiser son espace de stockage interne.
Tout ce qui est dit, alors que c'est sécuritaire de le faire, il n'est pas nécessairement une bonne pratique; elle tombe dans le domaine de tous les autres ou de variable globale accessible dans le monde peu de stockage, qui peut être un peu de l'objet de divergences. Généralement, je conseille qu'il est préférable d'éviter variable globale comme une règle. Tandis qu'il peut être acceptable dans certains cas, l'accès global va à l'encontre de votre capacité à contrôler l'accès à la variable et de faire respecter les invariants sur elle et l'état des contrôles ou implique. Cela peut conduire à difficile à maintenir des systèmes de base de code échelles parce que les chemins d'accès ne sont pas clairement énoncées.
C'est une mauvaise compréhension.
La mémoire n'est pas alloué au moment de la compilation. La mémoire est allouée au programme de démarragepuis pendant le programme, selon le de stockage types de variables. Et lorsque le programme d'arrêts, toute la mémoire utilisée par il retourne à l'OS, n'importe quoi.
Pas. Un objet de
std::vector<int>
ne peut jamais manger mémoire utilisé par une autre variable(s).Maintenant revenir à votre question principale,
Pas. Éviter les variables globales, indépendamment de leurs types.
Seulement l'espace pour le vecteur de métadonnées seront attribués dans la région pour les variables globales. Le vecteur contenu sera toujours allouée dynamiquement (constructeurs et destructeurs fonctionner normalement pour les variables globales).
C'est la même situation pour une automatique vecteur variable, comme:
Il y a une limite à la pile de l'espace disponible pour les variables automatiques, mais le vecteur contenu de ne pas utiliser cet espace, seule une poignée de pointeurs et les compteurs.
Bien, vec est une variable globale, de sorte que la mémoire c'est probablement attribué à partir du segment de données. Toutefois, la mémoire du contenu de vec dépend de l'allocateur. Par défaut, je pense que la mémoire du contenu est alloué dans le tas.
Variables globales sont en général d'une mauvaise pratique. Ils ne sont pas "manger" dans la mémoire d'une autre variable comme vous le dites, cependant, il est très facile pour vous que le programmeur à vis de quelque chose. Par exemple, tout le programme a accès à ce vecteur et donc tout ce qui peut y accéder et de le modifier. Vous pouvez ou ne voulez pas cela, mais plus que probablement, vous ne voulez pas cela.
Comme pour l'allocation de mémoire, les objets ajoutés à la vector sont encore ajouté de l'exécution (parce qu'ils n'existent pas sur le temps de compilation!). La mémoire n'est jamais attribuée au moment de la compilation. Votre programme a la signature en elle d'allouer de la mémoire au moment de l'EXÉCUTION. Pensez...si le programme de la mémoire allouée au moment de la compilation, vous ne pouvez pas vraiment être en mesure de les exécuter sur d'autres machines? La mémoire serait réparti sur VOTRE ordinateur, mais pas sur d'autres machines. Par conséquent, la mémoire doit être affecté à l'exécution.
De votre programme de ne pas affecter quoi que ce soit pendant le temps de compilation - je pense que vous voulez dire au moment de l'exécution.
Vecteur alloue qu'il détient sur le tas (vec.size() * sizeof(/* ce que vous tenez*/)) - il est titulaire d'sizeof(std::vector<>) où il est affecté. Les variables globales peuvent être stockées n'importe où, il dépend de la mise en œuvre.