Maison > développement back-end > C++ > Quelle quantité d'espace tampon est réellement nécessaire pour le placement en C de nouveaux tableaux ?

Quelle quantité d'espace tampon est réellement nécessaire pour le placement en C de nouveaux tableaux ?

DDD
Libérer: 2024-12-29 06:37:09
original
512 Les gens l'ont consulté

How Much Buffer Space is Really Needed for C   Placement-New Arrays?

Array Placement-New : Comprendre l'impact d'une surcharge non spécifiée

La norme C exige que les nouvelles expressions de placement de tableau puissent entraîner une surcharge non spécifiée dans le tampon alloué. Cette surcharge, représentée par les variables x et y, peut varier entre les différentes invocations de new.

Considérez l'exemple de code :

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

Selon la norme, l'expression placement-new new ( buffer) std::string[10] appellera en interne l'opérateur new[](sizeof(std::string) * 10 y, buffer).

Cependant, cela soulève un souci : si y est supérieur à 0, le tampon tampon pré-alloué peut être trop petit, entraînant une erreur d'exécution.

Comment pour déterminer la taille de tampon requise

La norme ne garantit pas que y sera toujours égal à 0. Pour garantir que le tampon pré-alloué est suffisant, vous pouvez calculer manuellement les frais généraux supplémentaires requis. Malheureusement, cela nécessite la connaissance des détails de mise en œuvre spécifiques à la plate-forme.

Alternative : approche indépendante de la mise en œuvre

Pour éviter de vous fier à des connaissances spécifiques à la mise en œuvre, vous pouvez utiliser votre propre placement array nouvelle implémentation qui vérifie la surcharge au moment de l'exécution :

inline
void*
operator new[](std::size_t n, void* p, std::size_t limit)
{
    if (n <= limit)
        std::cout << &quot;life is good\n&quot;;
    else
        throw std::bad_alloc();
    return p;
}
Copier après la connexion

En faisant varier la taille du tableau et en inspectant n dans l'exemple ci-dessus, vous pouvez déduisez la valeur de y pour votre plate-forme spécifique.

Mise à jour : élimination des frais généraux

Nicol Bolas a souligné qu'à partir de novembre 2019, un rapport de défaut a résolu ce problème, en veillant à ce que y soit toujours 0 pour l'opérateur new[](std::size_t, void* p). Ce changement s'applique rétroactivement à toutes les versions de C . Par conséquent, l’estimation des frais généraux n’est plus nécessaire.

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