C'è questo codice:gestore delle eccezioni
char text[] = "zim";
int x = 777;
Se guardo sulla pila in cui x e il testo sono messi lì di uscita è:
09 03 00 00 7a 69 6d 00
Dove:
- 09 03 00 00 = 0x309 = 777 < - int x = 777
- 7a 69 6d 00 = testo carattere [] = "zim" (codice ASCII)
ora c'è codice con try..catch:
char text[] = "zim";
try{
int x = 777;
}
catch(int){
}
Stack:
09 03 00 00 **97 85 04 08** 7a 69 6d 00
Ora tra testo e x è posto nuovo valore di 4 byte. Se aggiungo un altro fermo, quindi ci sarà qualcosa di simile:
09 03 00 00 **97 85 04 08** **xx xx xx xx** 7a 69 6d 00
e così via. Penso che questo sia un valore collegato alla gestione delle eccezioni e che venga usato durante lo sbobinamento dello stack per trovare il catch appropriato quando viene lanciata un'eccezione nel blocco try. Comunque la domanda è, qual è esattamente questo valore a 4 byte (forse qualche indirizzo per la struttura del gestore di excception o qualche id)?
Uso g ++ 4.6 su macchina Linux a 32 bit.
Vedere [C++ try/throw/catch => codice macchina] (http://stackoverflow.com/questions/1331220/c-try-throw-catch-machine-code), che rimanda a http: // www .codeproject.com/Articoli/2126/How-aC-compiler-implements-exception-handling –
Perché vuoi sapere. Anche se ti avessimo dato una risposta sarebbe specifico per il compilatore e per quella specifica versione del compilatore. Quindi tecnicamente non è una domanda in C++. È una domanda su g ++ e su come funziona. Che a meno che tu non sia veramente interessato a scrivere estensioni per g ++ è una conoscenza completamente inutile. –
@LokiAstari: g ++ e altri compilatori C++ per * nix utilizzano [Itanium ABI] (http://sourcery.mentor.com/public/cxx-abi/abi-eh.html) sulla maggior parte delle plaform (con alcune modifiche a seconda di la piattaforma), quindi non è * quella * piattaforma/compilatore specifico. Eppure, è interessante sapere come possono essere implementate le macchine per la gestione delle eccezioni. –