Come scoprire quali funzioni ha generato il compilatore?


11

Conosco le funzioni generate dal compilatore, la regola di tre e la regola di cinque. In scenari del mondo reale, potrebbe non essere banale capire esattamente quale delle funzioni generate dal compilatore (costruttori, operatori di assegnazione, distruttore) siano state effettivamente create dal compilatore.

Esiste un modo per elencare le funzioni generate dal compilatore per una classe specifica?

Sono principalmente interessato a Visual Studio 2019 e Xcode, ma una soluzione generica sarebbe ancora più gradita.

Risposte:


11

Le regole sono complicate. Ruberò da un'altra risposta che cita un tavolo dalla presentazione di Howard Hinnant .

inserisci qui la descrizione dell'immagine

La morale qui è che una buona pratica è quella di non fare affidamento sulle dichiarazioni implicite del compilatore e dichiarare esplicitamente ogni membro speciale (come predefinito o eliminato, a seconda delle esigenze)


Se dichiari esplicitamente ogni membro speciale che perdi lo stato di membri speciali "non dichiarato" per il costruttore di spostamenti e l'operatore di assegnazione.
Maxim Egorushkin,

@MaximEgorushkin il mio punto è dichiararli predefiniti se ne hai bisogno (anche se default può ancora significare non dichiarato) o eliminati se non li vuoi.
Bolov,

2
@bolov Il grafico è utile ma questo non risponde alla mia domanda. Voglio scoprire quali funzioni sono state effettivamente generate dal compilatore. In altre parole: non sto chiedendo cosa dovrebbe accadere in teoria, ma cosa sta accadendo in pratica.
Helge Klein

1
@ tjwrona1992: Con questo argomento, non avremmo mai bisogno di testare il nostro codice, perché sapremmo che se il compilatore avesse fatto qualcosa di diverso da quello che intendevamo, ci dovrebbe essere un bug.
Ruakh

1
@ tjwrona1992: Sì, esattamente. Allo stesso modo, il punto di vedere che cosa ha generato il tuo compilatore non è verificare che il compilatore sia corretto, ma piuttosto verificare di aver fornito al compilatore l'input corretto.
ruakh

7

"Esiste un modo per elencare le funzioni generate dal compilatore per una classe specifica?"

Certo che c'è. Su Linux (e altri sistemi Unix) è possibile utilizzare nm, readelfe objdumpil file oggetto generati / librerie / eseguibile di smontare loro e ispezionare tutti i simboli esportati (e molto altro).

Ci sono strumenti simili su Windows , lo so, ma non è una piattaforma con cui lavoro molto, quindi sfortunatamente non posso nominare nomi esatti di strumenti lì.


1
Sebbene questi strumenti potrebbero benissimo non mostrarti quali funzioni potrebbero essere state generate (ad esempio, al compilatore è stato permesso di generarle, ma non hai mai usato quelle funzioni, quindi ha deciso di non disturbare o l'eliminazione del codice link-time si è sbarazzata di loro)
JMAA

@JMAA Nella maggior parte dei casi, "consentito di generare ma mai utilizzato" significherebbe in termini standard che una funzione è stata "dichiarata implicitamente" ma non "definita implicitamente". Sì, ciò significa che non vedrai i simboli, anche se l'allineamento è disabilitato.
aschepler

1
A rigor di termini, questa risposta risponde più precisamente alla domanda posta: "Quali metodi ha generato il compilatore?" Non è la stessa domanda molto meno precisa "Quali metodi potrebbero essere stati generati dal compilatore in un contesto diverso?"
rici,

@rici True. Ma la domanda più precisa non è facilmente rispondibile, quindi ho optato per la risposta. Sentiti libero di votare se ritieni che la mia risposta non sia preziosa.
Jesper Juhl,

1
@jesper: no, ho già votato. Penso che la domanda a cui hai risposto sia più precisa, come ho detto. L'altra domanda, che potrebbe essere stata l'intenzione, richiede un po 'di lavaggi delle mani perché è contrafattuale: non sappiamo quali contesti ipotetici potrebbe includere. Ma questa è la domanda posta letteralmente, intenzionalmente o no, quindi complimenti per aver risposto.
rici,

1

Questa è attualmente solo una risposta parziale.

Visual Studio 2019

Costruttori

Quando si definisce un oggetto classe, la funzione IntelliSense di Visual Studio mostra i costruttori disponibili, sia generati dal compilatore che propri:

inserisci qui la descrizione dell'immagine

Questa informazione non sempre viene, purtroppo. Per farlo funzionare per lo screenshot qui sopra, ho dovuto digitare qualcosa tra parentesi, quindi la virgola.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.