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
DDDoriginal
2024-12-26 14:11:14413parcourir

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
};

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:
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