2012-12-19 8 views
7

Ho un progetto di elaborazione di immagini in espansione che fa molto affidamento sulla libreria OpenCV per gran parte delle sue funzionalità, anche se uso anche alcune funzioni di boost.Puntatori intelligenti OpenCV o Boost

Vorrei iniziare a utilizzare i puntatori intelligenti per sostituire alcuni puntatori grezzi che stanno iniziando a causare problemi. La mia domanda è su quale tipo di puntatore intelligente usare, con le mie scelte principali (credo) essere l'OpenCV cv::Ptr o una delle varianti di boost.

mi rendo conto ci sono una number di questions spiegare la differenza tra ciascuno dei puntatori Boost, ma speravo che qualcuno potrebbe offrire una spiegazione di come cv::Ptr confronta con loro e fare le raccomandazioni di uno o l'altro?

MODIFICA - Ho notato dallo OpenCV docs che Ptr è simile a potenziare shared_ptr, è la differenza essenziale solo quali librerie/file di inclusione sono necessari?

+3

Avete considerato di utilizzare i puntatori intelligenti standard (se avete accesso a C++ 11)? – undu

+0

+1 su 'std :: shared_ptr' se si utilizza C++ 11. Altrimenti dipende davvero dal fatto che tu stia già usando boost o stai pianificando di usare boost o di interoperare con le cose usando boost. Non penso valga la pena di includere boost solo per 'shared_ptr', dato che' cv :: Ptr' funziona abbastanza bene. – yiding

+2

Quale si utilizzerà dipenderà piuttosto dalle API che si sta chiamando - questi 3 tipi di puntatori intelligenti non sono necessariamente intercambiabili o forniscono operatori di conversione tra di loro. Per questo motivo, ci sono spesso buoni motivi per usare l'implementazione di 'boost :: shared_ptr' invece di' std :: shared_ptr' quando si usano altre parti della libreria boost. Lo stesso è probabile che valga anche per OpenCV. – marko

risposta

7

Per quello che posso vedere nella documentazione di OpenCV, questo è un puntatore intelligente conteggiato con riferimento, essenzialmente, uguale a boost::shared_ptr. Persino usa le operazioni atomiche sul conteggio dei riferimenti.

Farei la scelta in base alla portabilità e all'interoperabilità.

  1. Il vostro sistema sta per essere portato altrove e dipende da OpenCV di sicuro, ma non su boost? Quindi, attenersi a OpenCV cv::Ptr se è possibile evitare boost e si elimina la dipendenza.

  2. boost::shared_ptr suona bene con il resto di OpenCV? Se si ha qualcosa che restituisce un cv :: Ptr dalla libreria OpenCV, forse è meglio attenersi a cv :: Ptr in questi casi, perché il conteggio dei riferimenti sarà gestito in modo errato se si mescolano entrambi i tipi di puntatori e la risorsa potrebbe essere distrutta prematuramente.

  3. Hai intenzione di attenersi a boost ovunque porti il ​​progetto? Quindi, attenersi a boost::shared_ptr quando è possibile farlo, è più standard, la gente lo conosce e capirà immediatamente il codice. AGGIORNAMENTO: In C++ 11 hai std :: shared_ptr, che non ha alcuna dipendenza se puoi permettertelo, quindi puoi usare std :: shared_ptr in questo caso e sbarazzarti di boost.

Come nota a margine, c'è una tecnica per mescolare boost e std puntatori condivisi che possono mantenere il riferimento in modo corretto intorno e potrebbe essere utile per qualcuno. Vedere questa domanda, potrebbe essere rilevante anche per la miscelazione di altri tipi di puntatori di riferimento-contati: Conversion from boost::shared_ptr to std::shared_ptr?

Nella mia esperienza, quando qualcosa di porto, il minor numero di dipendenze, il migliore, o ci sono alcune piattaforme per le quali la compilazione può essere un inferno. Quindi fai la tua scelta in base alla portabilità se è una preoccupazione e l'interoperabilità dei puntatori con le librerie.

+2

Per i futuri lettori: una parte di questa risposta è probabilmente obsoleta dall'introduzione di 'std :: shared_ptr' in C++ 11: se la usi invece di' boost :: shared_ptr', il terzo punto non si applica Di Più. Ma il resto della risposta è ancora valido! – anderas

+0

Ho aggiornato la domanda per riflettere std :: shared_ptr in C++ 11 e mescolare i conteggi dei riferimenti. –