I modelli C ++ sono solo una specie di macro glorificate?

27

Da diversi confronti tra template C ++ e generici C # / Java come questo -

link

Ho la percezione che i modelli C ++ siano implementati da una sorta di pre-elaborazione (sostituzione del testo normale prima dell'analisi), non dalla compilazione. Perché il controllo del tipo nei modelli C ++ assomiglia alle macro C. Voglio dire, se ci sono degli errori, sono errori dal codice generato dopo l'elaborazione dei blocchi di codice basati su modelli, non dai modelli stessi. In altre parole, sono solo una specie di versione superiore di macro in C.

Poi ho trovato altri fatti che supportano questo -

  • Ho pensato che se i modelli C ++ sono implementati mediante pre-elaborazione, ci saranno problemi con il collegamento dinamico (usando .dll). E un googling veloce ha supportato questo.

  • Un altro punto è che le costanti integer possono essere passate come argomenti ai template. E supporta anche qualche tipo di ricorsione. Ma questa ricorsione non si trova nel codice assembly / macchina compilato. La ricorsione è gestita in tempo di compilazione generando una funzione per ogni chiamata ricorsiva e quindi con un binario eseguibile più grande ma più veloce.

Sebbene diversamente dai macro C, ha alcune abilità superiori. Ma il modello C ++ non è implementato con qualche tipo di pre-elaborazione? Come viene implementato in diversi compilatori C ++?

    
posta Gulshan 01.03.2011 - 18:39
fonte

5 risposte

7

I modelli C ++ sono una sorta di macro Lisp (o anche più Scheme) stupefatti. È un linguaggio completo di Turing che valuta in tempo di compilazione, ma è severamente limitato in quanto non vi è accesso da quella lingua all'ambiente C ++ sottostante. Quindi, sì, i modelli C ++ possono essere visti come una forma di pre-elaborazione, con un'interazione molto limitata con il codice generato.

    
risposta data 15.04.2011 - 19:08
fonte
41

Probabilmente la più grande differenza è che le macro C vengono espanse nella fase di pre-elaborazione, prima che venga eseguita qualsiasi altra compilazione, mentre i modelli C ++ fanno parte della compilazione. Ciò significa che i modelli C ++ sono sensibili al tipo e con scope, tra le altre cose, e non sono semplici sostituzioni testuali. Possono compilare funzioni reali e quindi evitare la maggior parte dei problemi che hanno le macro. Essere consapevoli del tipo significa che possono essere generali o specializzati: ad esempio, è facile fornire una funzione template swap e specializzazioni facili da scrivere che funzionano bene anche se gli oggetti gestiscono la memoria heap.

Pertanto: i modelli C ++ non sono preprocessi nello stesso senso, ma non sono un tipo di macro C, ed è impossibile usare le macro C per duplicare i modelli.

I modelli vivono nei file di intestazione, non nelle librerie collegate, true, ma se fornisci un file .dll, probabilmente stai fornendo anche un file di intestazione perché lo usi.

    
risposta data 01.03.2011 - 18:51
fonte
5

Importa il modo in cui sono implementati? I primi compilatori C ++ erano solo pre-processori che alimentavano il codice a un compilatore c, non significa che il C ++ sia solo una macro glorificata.

I modelli rimuovono la necessità di macro fornendo un modo più sicuro, più efficiente e specificabile (anche se non penso sia una parola reale) per implementare il codice per più tipi.

Ci sono molti modi per fare il codice di tipo di template in c, nessuno dei quali è molto bello una volta superato i semplici tipi.

    
risposta data 01.03.2011 - 18:42
fonte
5

Ci sono alcune differenze; per esempio, i template possono essere usati per istanziare un sovraccarico di funzione quando necessario, mentre con i macro, dovresti espandere la macro una volta per ogni sovraccarico possibile per renderlo visibile al compilatore, così finiresti con un sacco del codice inutilizzato.

Un'altra differenza è che i template rispettano gli spazi dei nomi.

    
risposta data 01.03.2011 - 18:55
fonte
2

I modelli IMHO, C ++ e C Macro erano pensati per risolvere due problemi completamente diversi. La libreria di modelli standard C ++ originale era un meccanismo per separare in modo pulito classi di contenitori (matrici, liste concatenate, ecc.) Dalle funzioni generiche comunemente applicate a loro (come l'ordinamento e la concatenazione). Avere rappresentazioni astratte di algoritmi e strutture dati efficienti porta a un codice più espressivo perché c'era un numero significativamente minore di congetture sul modo migliore per implementare una funzione che lavora su un particolare pezzo di dati. Le macro C erano molto più in linea con ciò che si vedrebbe in genere nelle macro Lisp, in quanto fornivano un mezzo per "estendere" la lingua con il codice inline. La cosa interessante è che la libreria standard C ++ ha esteso la funzionalità dei template per coprire la maggior parte di ciò che usiamo #define in C.

    
risposta data 19.04.2011 - 22:11
fonte

Leggi altre domande sui tag