12

È stato portato alla mia attenzione per tentativi ed errori che esistono Certian C++ 11 caratteristiche che dipendono da una sorta di compilatore magico (TM). Ho lavorato con l'implementazione del mio standard conforme allo standard stdlib. So che ci sono implementazioni prontamente disponibili dello stdlib, ma questo è più della mia versione personale per le piccole applicazioni.Funzionalità della libreria C++ 11 dipendenti dal proxy specifico del compilatore

Ieri sera ho implementato std::initializer_list in base alle specifiche, e mi stava avendo problemi a farlo funzionare, ho cercato di alta e bassa per anwers solo per essere lasciati con le dichiarazioni che era impossibile, e che richiederebbe modifiche del compilatore stesso . Bene, ho deciso di dare un'occhiata all'attuale implementazione dello libstdc++, e la mia implementazione è stata esattamente la stessa nel design, solo leggermente diversa ai bordi, ho sprecato ore inutili a capire perché l'implementazione non funzionava, quando era esattamente lo stesso nel design di quello in libstdc++. Non è stato fino a sei ore prima che mi rendessi conto che doveva essere nello spazio dei nomi std. Risulta che l'implementazione è merley un proxy per il compilatore che rende possibile il initializer_list e il compilatore stesso cerca la classe initializer_list in namespace std.

La mia domanda è ci sono altre funzionalità di libreria che dovrei sapere che richiedono una sorta di magia del compilatore speciale per funzionare, più connessioni proxy nascoste, o secrete compilazioni per il compilatore per le nuove funzionalità della libreria C++ 11 ? Mi piacerebbe conoscerli in anticipo così posso essere preparato per quando implemento altre funzionalità che dipendono dal compiler magic, invece di sprecare un giorno intero a comprenderlo per tentativi ed errori; che può diventare noioso e piuttosto fastidioso.

Grazie.

+1

Probabilmente molta magia ... –

risposta

11

Le funzioni in <exception> sono principalmente hook per il compilatore.

Diverse query di proprietà <type_traits> sono impossibili o molto difficili da implementare senza l'assistenza del compilatore. Anche quelli che sono semplicemente difficili potrebbero funzionare male dove lo stdlib nativo del compilatore ha successo a causa di "barare". E naturalmente si compileranno anche più velocemente.

Anche se è possibile scrivere <iostream> tale che cin e cout sono inizializzato automaticamente al primo utilizzo, la maggior parte dei compilatori scelgono di imbrogliare e collegarli in modo tale che essi sono in prima inizializzazione statico.

<typeinfo>, ovviamente, deve corrispondere esattamente a ciò che il compilatore si aspetta.

Probabilmente ci sono altre cose che non so o non riesco a pensare.

Oltre allo stdlib "cheating" e basato sul compilatore, il compilatore può anche fare affidamento su funzioni non standard esistenti nello stdlib. Quindi, anche se si implementano tutte le funzionalità standard, è probabile che sia necessario copiare e incollare le routine per le tabelle delle eccezioni, gestire la gerarchia nei distruttori virtuali, ecc.

+0

Dopo aver provato a capire come 'std :: function' funziona nei file di intestazione, sospetto che sia anche magico. –

5

Tutti i tipi "magici", quelli necessari al compilatore , sono elencati nella loro sezione speciale della specifica C++ denominata "Libreria di supporto linguistico". Ovviamente, se stai implementando la libreria standard C++, dovresti avere una copia dello standard a portata di mano. Gli elenchi di inizializzatori si trovano in quella sezione, nonché type_info, <cstdint>, gli operatori globali nuovo/elimina, <exception> e così via.

Non tentare di implementare questi; usa ciò che ti dà il compilatore.

+0

'' può essere fatto con l'introspezione, se non con la massima qualità, e il nuovo/delete sostituibile globale dovrebbe essere possibile con uno spazio dei nomi privato e una direttiva 'using' (non ho provato). Ma sì, la maggior parte di questa clausola si applica. - oops, tale 'new' non può essere chiamato' :: operator new', quindi hai ragione. – Potatoswatter

Problemi correlati