Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 12
  1. #1
    Utente di HTML.it
    Registrato dal
    Jun 2003
    Messaggi
    4,826

    [c++]risorse e gestione

    ciao.
    Passo a spiegare il mio problema:
    ho una serie di oggetti che devono accedere ad un altro oggetto comune che vorrei fosse instanziato una sola volta per tutte,sia per problemi di prestazioni(non voglio instanziarlo tutte le volte) sia perchè deve contenere le stesse informazioni ed "essere lo stesso" per tutte le classi che vi accedono.
    L'oggetto comune serve per gestire gli oggetti che vi accedono , ad es ho una collezione di risorse che vengono lette dagli oggetti che accedono all oggetto comune , e se la risorsa esiste viene passata , se non esiste viene instanziata e poi passata , e altre cose di qusto genere.
    Ho pensato ad una classe publica statica.
    Puo' essere la soluzione?
    Ho letto qualcosa sui singleton , questo è il caso di utilizzarli ?
    grasie.

  2. #2
    Utente di HTML.it L'avatar di shodan
    Registrato dal
    Jun 2001
    Messaggi
    2,381
    Ognuno dei due approcci presenta pregi e difetti. Difficile consigliare senza altri particolari.
    Il progetto è multithreading? Eventuali metodi di questo super oggetto si richiamano tra loro?
    Questo super oggetto viene usato in diverse unità di compilazione? (leggesi file.cpp).
    This code and information is provided "as is" without warranty of any kind, either expressed
    or implied, including but not limited to the implied warranties of merchantability and/or
    fitness for a particular purpose.

  3. #3
    Utente di HTML.it
    Registrato dal
    Jun 2003
    Messaggi
    4,826
    allora,
    1)il progetto attualmente non è multithreading,ma in un futuro lo sarà quasi sicuramente
    2)No , non ci sono metodi che si richiamano tra di loro
    3)si , deve essere richiamato da diversi file .cpp

  4. #4
    Utente di HTML.it L'avatar di shodan
    Registrato dal
    Jun 2001
    Messaggi
    2,381
    Il punto è che il singleton, a dispetto della sua semplicità, è rognosetto in ambito multithreading e può soffrire del cosidetto "static order initialization fiasco" in ambiente singlethreading.
    http://www.parashift.com/c++-faq-lit...html#faq-10.12
    per approfondimenti.
    Più sotto troverai alcuni suggerimenti per prevenirlo, ma valgono solo in ambito singlethreading e qui puoi leggere il perché:
    http://blogs.msdn.com/oldnewthing/ar.../08/85901.aspx
    Comunque prima di prendere paura, ci sono modi sicuri per prevenire anche questo.

    In ogni caso, sia per quanto riguarda il singleton sia la classe statica, dovrai far uso di mutex in ambito multithreading.
    This code and information is provided "as is" without warranty of any kind, either expressed
    or implied, including but not limited to the implied warranties of merchantability and/or
    fitness for a particular purpose.

  5. #5
    Utente di HTML.it
    Registrato dal
    Jun 2003
    Messaggi
    4,826
    intanto ti ringrazio sinceramente(rispondi sempre!)
    ma mi sa che le mie conoscenze non sono cosi' avanzate.
    Intanto il progetto non è multithreading penso che utilizzero' il singleton perchè in un futuro spero di essere piu' pratico .
    hai un link o un esempio sui google da consigliarmi?ce ne sono cosi' tanti!
    ciao shodan.

  6. #6
    Utente di HTML.it L'avatar di shodan
    Registrato dal
    Jun 2001
    Messaggi
    2,381
    Non ho nessun esempio particolare. Il singleton è semplice come pattern e tutta l'implementazione alla fine si risolve nel metodo instance.
    La scelta semmai è se restituire l'oggetto per puntatore o per reference. (Personalmente preferisco il reference: evita di gestire la distruzione di un puntatore rognoso).

    Qui ci sono due esempi.
    http://www.codeproject.com/KB/cpp/singletonrvs.aspx // puntatore

    http://www.devarticles.com/c/a/Cplus...tern-Part-I/4/ // reference
    This code and information is provided "as is" without warranty of any kind, either expressed
    or implied, including but not limited to the implied warranties of merchantability and/or
    fitness for a particular purpose.

  7. #7
    Utente di HTML.it
    Registrato dal
    Jun 2003
    Messaggi
    4,826
    grazie shodan.
    letto gli esempi.
    Un ultima cosa:
    quello che vorrei fare è un gestore di instanze(classi mesh,shaders ecc..) e di risorse ( texture , normal map ecc..)in directx 10.
    Ti chiedevo se secondo te è un buon metodo utilizzare gli smart pointers , dato che non posso cancellare una risorsa o uno shader se è gia in uso da un altra(o altre) mesh .
    vorrei che se in qualche modo il numero di riferimenti ad una risorsa va a 0 posso (a scelta) cancellare la risorsa o lo shader definitivamente con un bel delete.
    Per questo si usano gli smart pointers?
    non sono molto ferrato in materia, so che sono in librerie tipo la boost ma non li ho mai usati.
    ciao.

  8. #8
    Utente di HTML.it L'avatar di Stoicenko
    Registrato dal
    Feb 2004
    Messaggi
    2,254
    se sviluppi in win col visual studio esistono i compointers che fanno la stessa cosa (non so però se si possono usare solo con puntatori ad istanze com)

    sennò ci sono gli smart pointer che trovi ovunque nella rete, non servono librerie specifiche

  9. #9
    Utente di HTML.it
    Registrato dal
    Jun 2003
    Messaggi
    4,826
    Grazie Stoicenko, questo ti sembra il caso in cui utilizzarli? o sarebbe sempre il caso di utilizzarli?
    Non capisco perchè non vengono utilizzati di default , forse perchè non permettono di gestire la memoria come si vuole a manina coi delete pxxxx?
    Quale classe smartpointer mi consigli di utilizzare ?
    anche se sembra che ognuno valga l'altro mi piacerebbe essere consigliato su qualcosa di sicuro e magari che offra di piu' che un altro dato che non conosco bene l'oggetto.
    Grazie.

  10. #10
    Utente di HTML.it L'avatar di shodan
    Registrato dal
    Jun 2001
    Messaggi
    2,381
    Io consiglio sempre di usare smart pointer invece dei normali "stupid" pointer.
    Che non vengano usati di default è normale visto che il C++ non li supporta a livello di kernel del linguaggio. Tuttavia nel prossimo standard sono previsti e già da adesso in VS Studio (non Express) esistono nel namespace std::tr1. Per la cronaca, in giro nei forum, nei newsgroups e in vari articoli si parla ormai in termini di nuovo standard C++0X.

    Al momento i boost::shared_ptr sono quelli che più si avvicinano alla versione finale ANSI.
    Gli smart pointer si dividono in intrusivi e non intrusivi. I primi utilizzano un meccanismo di gestione del reference counter interno all'oggetto gestito (più o meno come COM), i secondi hanno il reference counter interno all'oggetto puntatore.

    Personalmente nelle mie classi uso spesso l'intrusive pointer, ma è perché le ho scritte io appunto. Se devo gestire una classe non scritta da me, uso uno shared_ptr di boost.
    Il mio consiglio è di iniziare a usare i boost::shared_ptr, testati da anni e di cui esiste molta documentazione in rete oppure quelli nel namespace std::tr1.
    This code and information is provided "as is" without warranty of any kind, either expressed
    or implied, including but not limited to the implied warranties of merchantability and/or
    fitness for a particular purpose.

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 © 2024 vBulletin Solutions, Inc. All rights reserved.