Domanda

Secondo Sergey Rjazanov, il suo incredibilmente veloce C ++ delegati non sono comparabili:

  

I miei delegati non possono essere paragonati. Gli operatori di confronto non sono definite perché un delegato non contiene un puntatore al metodo. Puntatore ad una funzione di stub può essere diverso nelle varie unità di compilazione.

Per quale i lettori hanno risposto:

  

"puntatore ad una funzione stub può essere diverso nelle varie unità di compilazione".   Per quanto ne so, questo non è vero. I compilatori sono tenuti a riutilizzare le funzioni template generati in diverse unità di compilazione (questo ne sono sicuro - ma credo che Borland una volta violato questa regola). Penso che sia perché le classi (quelle non in spazi dei nomi 'senza nome') utilizzano collegamento esterno e il modo in cui si utilizzano le funzioni di stub sempre impedire loro di essere inline (anche se questo non dovrebbe essere un problema o come prendere l'indirizzo della funzione forzerà una versione non in linea per generare e 'linkage esterno' eseguita dal linker eliminerà tutte tranne una funzione nome simile (si presume e tenuti ad essere identico dallo standard)) ...

     

Se si definisce una sola unità di traduzione funzione template (file cpp) e poi definire la stessa funzione in modo diverso in un'altra unità di traduzione, solo una delle due versioni sarà riuscire ad entrare nella eseguibile finale. (Questo viola in realtà il "Una regola Definizione", ma lavora su GCC, almeno ... non è sicuro su MSVC.) Il punto è:. L'indirizzo [dello stub] sarà lo stesso in unità diverse

     

Vi invito ad aggiornare l'articolo (inclusa la capacità di confronto) se si trova che questo è vero per MSVC -. Se è MSVC conferimento standard, a questo proposito

Ora l'articolo è di quattro anni, e l'autore non ha risposto a qualsiasi dei commenti nel corso degli ultimi tre anni o giù di lì, quindi mi chiedo se c'è qualche merito al commento di cui sopra e se questa implementazione specifica può infatti essere modificato per supportare il confronto.

La serie C ++ espressamente vieta tale uso e, se sì, sono una delle recenti compilatori effettivamente conforme agli standard in proposito?

È stato utile?

Soluzione

Il codice è sia conformi allo standard, e fine. Non vedo alcun posto in cui egli viola ODR, ed è vero che tutte le istanze di un modello di funzione con gli stessi parametri di modello dovrebbero avere "lo stesso indirizzo" (nel senso che i puntatori alle funzioni dovrebbero essere tutti uguali) - come questo risultato è ottenuto non è importante. ISO C ++ 03 14.5.5.1 [temp.over.link] descrive le regole in modo più dettagliato.

Quindi, il confronto potrebbe essere definito non in maniera conforme e portatile.

Altri suggerimenti

Il cosiddetto stub funzioni incredibilmente veloci C ++ delegati funzioni statiche membro template , che sono fondamentalmente funzioni template . Lo stesso vale per la variante migliorata velocità impossibile C ++ delegati, fisso.

Quindi la domanda si riduce a questo:

fare istanze di una funzione template (utilizzando gli stessi parametri del modello e la definizione) in diverse unità di traduzione condividono lo stesso indirizzo di puntatore a funzione?

Secondo lo standard C ++ (ISO C ++ 17, § 17.5.6.1), la risposta è .

Come ha detto @Pavel nella sua risposta, la stessa applicata per l'ISO C ++ 03 standard (ISO C ++ 03, § 14.5.5.1).

In altre parole, questo approccio è standard compatibile e delegati sono sicuro comparabili -. Loro dati risultano uguali se e solo se sono legati alla stessa funzione e (nel caso di funzioni membro) lo stesso oggetto

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top