Visualizzazione dei risultati da 1 a 6 su 6

Hybrid View

  1. #1
    La cosa che in assoluto costa meno è passare un functore come parametro template; in tal caso, il compilatore ha il "quadro completo", sa subito chi verrà chiamato e può fare inlining di tutto quel che crede necessario.

    In alternativa, in genere puntatori a funzione, puntatori a funzione membro e funzioni virtuali costano poco di più; il costo del branch misprediction in genere è molto basso se si continua a chiamare la stessa funzione (il branch predictor impara rapidamente dove deve effettivamente andare), il costo principale è rappresentato dalla mancata opportunità di inlining, che, per funzioni molto piccole e ben espandibili in linea, può essere considerevole.

    std::function, infine, è inevitabilmente "costosa", dato che, per ottenere l'effetto della type erasure, fa uso di doppia indirezione con di mezzo chiamate virtuali.
    Amaro C++, il gusto pieno dell'undefined behavior.

  2. #2
    Utente di HTML.it
    Registrato dal
    Jun 2003
    Messaggi
    4,826
    Quote Originariamente inviata da MItaly Visualizza il messaggio
    La cosa che in assoluto costa meno è passare un functore come parametro template; in tal caso, il compilatore ha il "quadro completo", sa subito chi verrà chiamato e può fare inlining di tutto quel che crede necessario.

    In alternativa, in genere puntatori a funzione, puntatori a funzione membro e funzioni virtuali costano poco di più; il costo del branch misprediction in genere è molto basso se si continua a chiamare la stessa funzione (il branch predictor impara rapidamente dove deve effettivamente andare), il costo principale è rappresentato dalla mancata opportunità di inlining, che, per funzioni molto piccole e ben espandibili in linea, può essere considerevole.

    std::function, infine, è inevitabilmente "costosa", dato che, per ottenere l'effetto della type erasure, fa uso di doppia indirezione con di mezzo chiamate virtuali.
    grazie MItaly.
    Se passo un functore come parametro template(in che classe mesh?)pero' non posso inserire i miei oggetti mesh in un container(penso) o c'è il modo di farlo?senza usare pero' any di boost, posso incapsulare un functore in una classe tipo Mesh senza parametri template?Creando magari la classe mesh in una host class che ha il parametro template il functore .
    Ma in pratica tutti i giri e rigiri sono per ottenere in qualche modo una type erasure e questo si puo fare coi template senza std::function o in un qualche modo piu prestazionale?
    ripeto in base a test ,std::function è 4 volte piu lenta e questo per il mio lavoro non è accettabile, quindi probabilmente dovro cambiare il disegno delle classi, magari ritornando alle funzioni virtuali che sono molto piu prestaionali di std::function.
    Le funzioni da chiamare sarebbero molto piccole e mi dispiace abbandonare l'inlining.
    Per finire mi piace l'uso di usare policy per creare le classi di disegno , in quanto ho moltissime configurazioni ma vorrei poter inserire le classi di disegno (mesh) in un container senza un crollo di prestazioni.
    ciao

  3. #3
    Utente di HTML.it
    Registrato dal
    Jun 2003
    Messaggi
    4,826
    Quote Originariamente inviata da MItaly Visualizza il messaggio
    La cosa che in assoluto costa meno è passare un functore come parametro template; in tal caso, il compilatore ha il "quadro completo", sa subito chi verrà chiamato e può fare inlining di tutto quel che crede necessario.
    grande! era meglio che leggessi con attenzione.
    Ho creato un functore base con l'operator()() virtuale ed ho ereditato classi da questo functore, ognuna con una procedura di disegno.
    a questo punto con uno shader posso far creare un oggetto ad una classe host, magari passando anche il functore come parametro template ed ho un maggior grado di configurazione shader/funzioni/functori di disegno e questo oggetto è perfettamente inseribile in un container perchè nell oggetto ho inserito un puntatore al functore astratto e vi posso inserire qualsiasi functore di disegno, dato che ereditano tutti dal functore astratto.
    grazie.

    ps.per lì'inlining come devo fare dato che le funzioni di disegno sono al massimo 20 30 righe di codice , sono troppe? come posso renderle 'inlining? non sono cose che sceglie il compilatore?


    ciao.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2026 vBulletin Solutions, Inc. All rights reserved.