Maison > développement back-end > C++ > Comment les exceptions fonctionnent-elles en interne en C ?

Comment les exceptions fonctionnent-elles en interne en C ?

Linda Hamilton
Libérer: 2024-10-24 07:32:02
original
209 Les gens l'ont consulté

How Do Exceptions Operate Internally in C  ?

Comment fonctionnent les exceptions dans les coulisses en C

Introduction :

Les exceptions sont souvent remises en question pour leur efficacité. Cet article explore le fonctionnement complexe des exceptions en C pour fournir une compréhension complète de leur processus d'exécution.

Mécanisme de gestion des exceptions :

Les exceptions ne s'apparentent pas directement à des exécutions répétées. les retours ; ils impliquent une couche supplémentaire de tables d’exceptions. Lorsqu'une exception est levée, le compilateur génère un appel à __cxa_throw, qui utilise ces tables pour trouver le gestionnaire et dérouler la pile jusqu'à ce qu'elle atteigne le gestionnaire approprié.

Lancement d'une exception :

Lancer une exception nécessite une surcharge d'exécution importante car :

  • __cxa_throw doit localiser le gestionnaire et dérouler la pile.
  • L'exception allouée doit être détruite après l'exécution du gestionnaire. .

Retours exceptionnels :

En revanche, le renvoi d'une valeur entraîne une surcharge minime. Les exceptions doivent être utilisées avec parcimonie, uniquement pour des scénarios exceptionnels.

Exemple de code :

Le code C simpliste suivant illustre la génération d'instructions pour la gestion des exceptions :

<code class="cpp">class MyException
{
public:
    MyException() { }
    ~MyException() { }
};

void my_throwing_function(bool throwit)
{
    if (throwit)
        throw MyException();
}

void another_function();
void log(unsigned count);

void my_catching_function()
{
    log(0);
    try
    {
        log(1);
        another_function();
        log(2);
    }
    catch (const MyException& e)
    {
        log(3);
    }
    log(4);
}</code>
Copier après la connexion

Assemblage généré :

La compilation de ce code avec GCC sous Linux a abouti au résultat d'assemblage suivant :

  1. Lancement d'une exception :

    _Z20my_throwing_functionb:
     ...
     movl    , (%esp)
     call    __cxa_allocate_exception
     ...
     movl    %eax, (%esp)
     call    __cxa_throw
     ...
    Copier après la connexion
  2. Tableau de gestion des exceptions :

    .section    .gcc_except_table,&quot;a&quot;,@progbits
    .LLSDATT9:
     ...
     .uleb128 .LEHB1-.LFB9
     .uleb128 .LEHE1-.LEHB1
     .uleb128 .L12-.LFB9
     .uleb128 0x1
     ...
    Copier après la connexion

Conclusion :

Les exceptions nécessitent des frais généraux pour la manipulation et le déroulement, tandis que les valeurs de retour entraînent des dépenses minimes. Les exceptions sont optimales pour des scénarios exceptionnels, mais doivent être utilisées judicieusement pour éviter une dégradation des performances.

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