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
511 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!

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