Maison >développement back-end >C++ >Est-ce que `std::vector::resize()` de C 11 et `boost::container::vector::resize()` de Boost.Container s'initialisent toujours comme prévu ?

Est-ce que `std::vector::resize()` de C 11 et `boost::container::vector::resize()` de Boost.Container s'initialisent toujours comme prévu ?

DDD
DDDoriginal
2024-12-09 08:07:06688parcourir

Does C  11's `std::vector::resize()` and Boost.Container's `boost::container::vector::resize()` Always Value-Initialize as Expected?

Vector::resize() en C 11 et Boost.Container se comportent-ils comme prévu ?

En C 03, le std:: La fonction vector::resize() n’avait qu’une seule surcharge capable d’initialiser de nouveaux éléments avec une valeur spécifique. C 11 a introduit deux surcharges : resize(size_type n) pour l'initialisation de la valeur et resize(size_type n, const value_type &val) pour l'initialisation de la copie.

Boost.Container's boost::container::vector prend également en charge l'initialisation de la valeur dans sa méthode resize(). Cependant, après avoir testé le comportement de std::vector de C 11 et de boost::container::vector de Boost.Container, il a été observé que les éléments finaux ajoutés aux vecteurs étaient toujours initialisés avec des zéros, même si l'intention était d'utiliser initialisation de la valeur.

Comprendre le comportement attendu :

L'initialisation de la valeur signifie que la nouvelle les éléments doivent être initialisés avec leurs valeurs par défaut (par exemple, 0 pour les entiers), tandis que l'initialisation par copie signifie que les nouveaux éléments doivent être initialisés avec des copies de la valeur fournie.

Résultats des tests :

Le code suivant a été utilisé pour tester le comportement :

int main()
{
    // Initialize vectors
    std::vector<int> std_vec;
    bc::vector<int> boost_vec;
    bc::vector<int> boost_vec_default;
    // Fill and resize vectors
    init_vec(std_vec);
    init_vec(boost_vec);
    init_vec(boost_vec_default);
    // Resize vectors to 10 elements using different techniques
    std_vec.resize(10);
    boost_vec.resize(10);
    boost_vec_default.resize(10, bc::default_init);
    // Print results
    print_vec("std", std_vec);
    print_vec("boost", boost_vec);
    print_vec("boost w/default", boost_vec_default);
}

Compilation en C 03 Mode :

La sortie en mode C 03 est comme prévu. Les nouveaux éléments dans std_vec et boost_vec sont initialisés avec des zéros, tandis que les éléments dans boost_vec_default sont initialisés par défaut.

Compilation en mode C 11 :

Cependant, la sortie en C Le mode 11 montre que les nouveaux éléments dans std_vec et boost_vec sont toujours en cours d'initialisation avec des zéros. Cela indique que le comportement attendu de resize(size_type n) n'est pas respecté.

Explication :

La raison de ce comportement inattendu est que le compilateur est peut-être en train d'optimiser l'appel à la surcharge d'initialisation de valeur de resize(). Pour appliquer l'initialisation de la valeur, un allocateur peut être utilisé pour remplacer la méthode construct() pour effectuer explicitement l'initialisation de la valeur.

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