Maison > développement back-end > C++ > Quelle surcharge non spécifiée les nouvelles expressions de placement de tableau C 11 entraînent-elles ?

Quelle surcharge non spécifiée les nouvelles expressions de placement de tableau C 11 entraînent-elles ?

DDD
Libérer: 2024-12-13 19:07:14
original
426 Les gens l'ont consulté

What Unspecified Overhead Do C  11 Array Placement-New Expressions Incur?

Array Placement-New Overhead in the Buffer

La spécification C 11 indique que toutes les nouvelles expressions de tableau peuvent entraîner une surcharge non spécifiée, y compris celles qui font référence à la fonction de bibliothèque opérateur new[](std::size_t, void*) et autres fonctions d'allocation de placement. Cette surcharge peut varier à chaque invocation de new.

Considérons l'exemple :

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

Selon la spécification, new (buffer) std::string[10] invoquera l'opérateur new[ ](sizeof(std::string) * 10 y, buffer), où y est une valeur de surcharge non négative non spécifiée. Si vous > 0, le tampon pré-alloué sera insuffisant.

Détermination de la taille du tampon requis

Il n'est pas possible de déterminer avec précision la valeur de surcharge y à partir de la norme. Par conséquent, il n'est pas recommandé d'utiliser l'opérateur new[](std::size_t, void* p) sauf si vous avez des connaissances spécifiques sur l'implémentation de la plateforme.

Si vous devez utiliser array placement-new avec un pré -tampon alloué, vous pouvez créer votre propre nouvelle fonction de tableau de placement pour vérifier dynamiquement la surcharge :

inline
void*
operator new[](std::size_t n, void* p, std::size_t limit)
{
    if (n <= limit)
        std::cout << "life is good\n";
    else
        throw std::bad_alloc();
    return p;
}

int main()
{
    alignas(std::string) char buffer[100];
    std::string* p = new(buffer, sizeof(buffer)) std::string[3];
}
Copier après la connexion

En faisant varier la taille du tableau et en inspectant la valeur n, vous pouvez déduire le y frais généraux pour votre plateforme.

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