Maison > développement back-end > C++ > L'interface `std::vector::resize()` de C 11 change-t-elle efficacement la valeur et initialise les nouveaux éléments ?

L'interface `std::vector::resize()` de C 11 change-t-elle efficacement la valeur et initialise les nouveaux éléments ?

DDD
Libérer: 2024-12-26 14:11:14
original
419 Les gens l'ont consulté

Does C  11's `std::vector::resize()` Interface Change Effectively Value-Initialize New Elements?

Enquête sur le comportement de std::vector::resize() et de resize() de Boost.Container

En C 03, std::vector : :resize() initialise les éléments nouvellement alloués avec des copies de la valeur fournie. C 11 a introduit des surcharges pour permettre l'initialisation de la valeur ou l'initialisation via copie.

À l'aide du vecteur de Boost.Container, qui prend en charge trois surcharges resize() similaires à C 11, un test a été effectué pour vérifier le comportement. En mode C 03, les vecteurs std :: vector et Boost.Container se sont comportés comme prévu, initialisant les nouveaux éléments avec des zéros.

Cependant, en mode C 11, les vecteurs std :: vector et Boost.Container sont toujours initialisés nouveaux éléments avec des zéros lors de l'utilisation de la surcharge destinée à l'initialisation de la valeur. Cela soulève la question :

Le changement d'interface C 11 std::vector::resize() est-il réellement efficace ?

Les résultats suggèrent que le changement d'interface n'a pas eu l'effet escompté, car de nouveaux éléments sont toujours en cours d'initialisation dans les deux implémentations.

Addendum

Pour répondre aux limitations de l'allocateur existant, un adaptateur d'allocateur alternatif a été proposé qui fournit un moyen plus sûr et plus fiable d'obtenir l'initialisation de la valeur sans initialiser tous les types d'éléments :

template <typename T, typename A=std::allocator<T>>
class default_init_allocator : public A {
  // ... implementation
};
Copier après la connexion

Cet adaptateur s'interpose sur construct() appelle value- initialisation, en les transformant en appels d'initialisation par défaut. Il gère également correctement l'initialisation par défaut.

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!

Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal