désactiver la valeur de remplissage de vecteur lors du redimensionnement? c ++

StackOverflow https://stackoverflow.com/questions/607864

  •  03-07-2019
  •  | 
  •  

Question

Je suis dans une situation où je dois utiliser une fonction de style c qui renvoie le len copié. J'ai décidé de redimensionner au maximum, puis de le redimensionner à la longueur renvoyée Agrandir la taille du vecteur passé en mémoire

Je sais que redimensionner définit la valeur sur fillValue (toujours 0?). Donc, il va y avoir une initialisation inutile (moins d'un Mo chaque fois) 60 fois par seconde. Existe-t-il un moyen de désactiver l’initiation du redimensionnement?

Était-ce utile?

La solution

Fondamentalement non. Les éléments du vecteur sont construits par défaut lors d’un redimensionnement (pour un entier, la valeur est 0).

En supposant que vous utilisez reserve () pour vous assurer que resize () n'alloue pas de mémoire, je ne m'inquiéterais pas de cela à moins que cela ne se révèle être un problème de performance ultérieurement.

Si vous êtes inquiet, vous pouvez envisager d’utiliser simplement un tableau classique et de stocker le nombre d’éléments dans une variable distincte. Cela vous donnera les meilleures performances.

Mise à jour:

John a demandé:

  

Le constructeur est-il vraiment garanti   mettre à zéro cette mémoire? Je pensais que   était indéfini?

Oui et non. Les types primitifs (int, bool, float, etc.) ont des constructeurs par défaut qui les initialisent à zéro. Cependant, contrairement aux classes ou structures habituelles, le compilateur ne les appelle pas automatiquement.

E.g

int a;         // uninitialized
int b = int(); // initialized to 0

Étant donné que vector :: resize utilise ce dernier formulaire lors de l'ajout d'éléments, vous avez la garantie que les éléments créés seront correctement initialisés à zéro. Cela est vrai de toutes les collections STL qui créent implicitement des éléments.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top