Ho letto il codice sorgente di Clang e ho scoperto qualcosa di interessante sull'ABI di C++ ARM che non riesco a capire per giustificazione. Dalla una versione online del ARM ABI documentation:ARM C++ ABI: valori di ritorno costruttore/distruttore
Questo ABI richiede C1 e costruttori C2 per tornare questo (invece di essere funzioni void) in modo tale che un costruttore C3 può coda chiamare il costruttore C1 e il costruttore C1 può coda chiamare C2.
(e analogamente per i distruttori non virtuali)
io non sono sicuro di quello che C1
, C2
, e C3
riferimento qui ... questa sezione è destinata ad essere una modifica del §3.1.5 da il generico (cioè Itanium) ABI, ma quella sezione (almeno in this online verison) afferma semplicemente:
Costruttori tornare nulli risultati.
Comunque, io davvero non riesco a capire quale sia lo scopo di questo è: come fa un ritorno costruttore questo consentire l'ottimizzazione chiamata coda, e in quali circostanze?
Per quanto posso dire, l'unica volta che un costruttore potrebbe chiamare un altro con lo stesso valore di ritorno this
sarebbe il caso di una classe derivata con una singola classe di base, un corpo di costruttore banale, nessun membro con non banale costruttori e nessun puntatore di tabella virtuale. In realtà, sembra che sarebbe effettivamente più facile, non difficile, ottimizzare con una coda chiamata con un ritorno void
, perché allora la restrizione di una singola classe di base potrebbe essere eliminata (nel caso della classe base multipla, il puntatore this
restituito dall'ultimo costruttore chiamato non sarà il puntatore this
dell'oggetto derivato).
Cosa mi manca qui? C'è qualcosa nella convenzione di chiamata ARM che rende necessario il ritorno this
?
Sospetto che C1, C2 e C3 facciano riferimento a "costruttore di oggetti completo", "costruttore di oggetti di base" e "costruttore di allocazione di oggetti completo", su cui è possibile leggere più [qui] (http://stackoverflow.com/ domande/6921295/doppia emissione di costruttori-simboli) – Michael
@Michael ahh, QUESTO ha senso (sapeva che esistevano, ma non conoscevo la convenzione dei nomi storpiati ... Ho assunto 'C1',' C2', e 'C3' si riferiva a costruttori in qualche gerarchia in un diagramma che mancava). Non riesco ancora a capire il caso del distruttore. –
@Michael ok, grazie per il collegamento, capisco anche il caso del distruttore ora, penso ... se nessuno risponde così autorevolmente, risponderò io stesso ad un certo punto –