2010-12-14 47 views
10

En regardant vector, j'ai réalisé que je n'ai jamais utilisé le second argument lors de la création de vecteurs.Deuxième argument de std :: vector

std::vector<int> myInts; // this is what I usually do 
std::vector<int, ???> myOtherInts; // but is there a second argument there? 

Axé sur le lien ci-dessus, il dit qu'il est pour:

objet allocateur être utilisé au lieu de construire un nouveau.

ou, pour this one:

allocateur: Type de l'objet allocateur utilisé pour définir le modèle d'allocation de stockage. Par défaut, le modèle de classe d'allocation pour le type T est utilisé, qui définit le modèle d'allocation de mémoire le plus simple et est indépendant de la valeur.

Je suppose que cela a quelque chose à voir avec la gestion de la mémoire. Cependant, je ne suis pas sûr de savoir comment l'utiliser.

Des pointeurs à ce sujet?

+0

Voici un exemple de définir votre owm allocateur: http://stackoverflow.com/questions/3984588/c-stl-vector-reserve/3984720#3984720 –

+0

@skwllsp: qui semble intéressant. Voudriez-vous que je change d'avis ou allez-vous chercher l'insigne du héros méconnu? :) – Default

+2

J'ai oublié d'ajouter un point. J'ai utilisé les propres allocateurs quand j'ai dû trouver la quantité de mémoire consommée par mes conteneurs. J'ai écrit à ce sujet une réponse un peu long: http://stackoverflow.com/questions/2160300/how-to-find-the-memory-used-by-any-object/2160786#2160786 –

Répondre

4

L'allocateur par défaut, std::allocator<>, gère toutes les allocations effectuées par std::vector<> (et autres). Il fera de nouvelles allocations à partir du tas chaque fois qu'une nouvelle allocation est nécessaire. En fournissant un allocateur personnalisé, vous pouvez par exemple allouer un gros morceau de mémoire à l'avance, puis le découper et distribuer des pièces plus petites lorsque des allocations distinctes sont nécessaires. Cela augmentera considérablement la vitesse d'allocation, ce qui est bon, par exemple dans les jeux, au prix d'une complexité accrue par rapport à l'allocateur par défaut.

Certaines implémentations de type std ont un stockage interne basé sur une pile pour de petites quantités de données. Par exemple, std::basic_string<> peut utiliser ce qu'on appelle une optimisation de petite chaîne , où seules les chaînes de longueur supérieure à une longueur fixe, disons 16 caractères (juste un exemple!), Reçoivent une allocation de l'allocateur, sinon un tableau interne est utilisé.

+0

mais dans 'std :: '', le 'int's ne finissent-ils pas sur la pile? – Default

+0

@Default - no. std :: vector (par défaut) alloue son stockage sur heap. – atzz

+0

@Default: S'il vous plaît voir mon ajout à propos de * petite optimisation de chaîne *. –

1

Allocators (STL) vous aider à gérer la mémoire pour vos objets dans la classe de vecteur. vous pouvez utiliser l'allocateur personnalisé pour différents modèles de mémoire (etc).

2

Les allocateurs personnalisés sont rarement utilisés dans le cas général. Quelques exemples d'où ils peuvent être utiles:

  • Optimisation pour un modèle spécifique d'allocations. Par exemple, un programme concurrent peut pré-allouer un gros morceau de mémoire via des moyens standard au début de l'exécution de la tâche, puis en raser les morceaux sans bloquer le mutex du tas global. Lorsque la tâche est terminée, tout le bloc de mémoire peut être éliminé. Pour utiliser cette technique avec des conteneurs STL, un allocateur personnalisé peut être utilisé.

  • Logiciel embarqué, où un périphérique possède plusieurs plages de mémoire avec des propriétés différentes (en cache/non connecté, rapide/lent, volatile/persistant, etc.). Un allocateur personnalisé peut être utilisé pour placer des objets stockés dans un conteneur STL dans une région de mémoire spécifique.

+0

Donc, fondamentalement, je pourrais aussi bien l'ignorer jusqu'à ce que j'ai besoin de s'inquiéter de la gestion de la mémoire :) – Default

+0

@Default - fondamentalement, oui. Sur une note différente, vous devrez peut-être prendre en compte la présence du deuxième paramètre lors du passage d'un modèle de conteneur STL en tant que * modèle modèle * à un autre modèle. Mais normalement ce n'est pas une situation fréquente aussi. :) – atzz