Maison > développement back-end > C++ > Comment prendre en compte les frais généraux lors de l'utilisation de Placement-New pour l'allocation de tableau en C ?

Comment prendre en compte les frais généraux lors de l'utilisation de Placement-New pour l'allocation de tableau en C ?

Barbara Streisand
Libérer: 2024-12-12 14:12:10
original
847 Les gens l'ont consulté

How to Account for Overhead When Using Placement-New for Array Allocation in C  ?

Array Placement-New : Détermination d'une surcharge non spécifiée dans le tampon

En C , l'opérateur placement-new permet de construire des objets directement dans la mémoire allouée au préalable. Lorsque vous utilisez placement-new pour allouer un tableau, il est essentiel de tenir compte de la surcharge potentielle non spécifiée encourue par l'opération.

La norme C 11 dicte que l'expression placement-new new(buffer) T[5] appelle l'opérateur new[](sizeof(T)*5 y, buffer). Ici, y représente une valeur de surcharge non négative qui varie d'un appel à l'autre. Cette surcharge peut avoir un impact sur la taille du tampon préalloué si sa valeur est supérieure à zéro.

Considérez l'extrait de code suivant :

void* buffer = malloc(sizeof(std::string) * 10);
std::string* p = ::new (buffer) std::string[10];
Copier après la connexion

Sans connaissance préalable de y, il est difficile de déterminer la quantité appropriée de mémoire à allouer au tampon. Si y est supérieur à zéro, le tampon alloué peut être insuffisant.

Pour résoudre ce problème, la norme a initialement laissé la responsabilité de déterminer la surcharge aux détails de mise en œuvre. Cette incertitude obligeait souvent les développeurs à éviter d'utiliser l'opérateur new[](std::size_t, void* p) ou à implémenter leur opérateur de placement array-new pour la vérification à l'exécution.

Mise à jour

Heureusement, un rapport de défaut en 2019 a rectifié ce problème en modifiant la norme pour préciser que y est toujours nul pour l'opérateur nouveau[](std::size_t, void* p). Cet ajustement s'applique rétroactivement à toutes les versions de C , offrant un comportement d'allocation cohérent et prévisible.

Par conséquent, la détermination de la surcharge non spécifiée n'est plus nécessaire lors de l'utilisation de placement-new pour allouer des tableaux directement dans la mémoire pré-alloué. Les développeurs peuvent utiliser en toute sécurité l'opérateur new[](std::size_t, void* p) sans craindre de dépasser la taille du tampon.

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!

source:php.cn
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal