Comportement des vecteurs en C 11 et Boost.Container : gestion des éléments non initialisés
Dans les applications C, les vecteurs sont couramment utilisés comme tampons temporaires. Pour garantir une capacité adéquate, ces vecteurs subissent souvent des opérations de redimensionnement. En C 03, la fonction std::vector::resize() développe le vecteur en ajoutant des copies d'une valeur spécifiée. Bien que cette approche initialise les éléments inutilisés, elle peut s'avérer inefficace lorsque seule la taille du vecteur compte.
C 11 a introduit deux surcharges de resize() :
- resize(size_type n) : exécute la valeur initialisation des éléments inutilisés.
- resize(size_type n, const value_type & val) : initialise les éléments inutilisés avec une copie du valeur fournie.
Boost.Container étend encore cette fonctionnalité avec une surcharge supplémentaire :
- resize(size_type n, default_init_t) : effectue une initialisation par défaut pour les éléments inutilisés.
Pour vérifier le comportement de ces fonctions, un test a été réalisé à l'aide de C 11 std::vecteur et boost::container::vector:
- Vecteurs remplis avec des valeurs [0, 1, 2, 3, 4, 5, 6, 7, 8, 9].
- Suppression de certains éléments pour créer des vecteurs avec la taille souhaitée [0, 1, 2, 3, 4].
- Vecteurs redimensionnés à 10 éléments en utilisant différentes surcharges resize().
- Impression des vecteurs mis à jour.
Comportement attendu
Pour le C 03 std::vector, les éléments inutilisés doivent être initialisé avec des zéros. Les variantes boost::container devaient émuler le comportement C 03 lorsqu'elles sont compilées en mode C 03 et présenter un comportement différent lorsqu'elles sont compilées en mode C 11.
Résultats réels
Étonnamment, les résultats des tests ont révélé que les deux std::vector et boost::conteneur::vecteur présentait le même comportement. Dans tous les cas, les éléments inutilisés ont été initialisés avec des zéros, quelle que soit la surcharge resize() utilisée.
Explication
Ce comportement inattendu suggère que l'interface resize() le changement introduit dans C 11 n’a aucun effet pratique dans le scénario donné. La fonction C 03 std::vector::resize() initialise par défaut les éléments inutilisés. En C 11, les surcharges resize() fournissent des options supplémentaires pour l'initialisation explicite, mais elles ne modifient pas le comportement par défaut des éléments inutilisés initialisés par défaut. Le même comportement se reflète dans l'implémentation de Boost.Container.
Implications
Si vous devez éviter d'initialiser des éléments inutilisés avec des zéros, vous pouvez utiliser un allocateur personnalisé qui intercepte la méthode construct() de std::allocator et remplace l'initialisation de la valeur par l'initialisation par défaut. Cependant, procédez avec prudence, car l'appliquer à toutes les initialisations peut entraîner des conséquences inattendues.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!