2012-12-19 13 views
7

Geniş bir görüntü işleme projem var. Bu özellik, işlevselliğinin büyük bir kısmı için OpenCV kütüphanesine büyük ölçüde dayanıyor.OpenCV veya Boost akıllı işaretçiler

Sorunlara neden olan bazı ham işaretçileri değiştirmek için akıllı işaretçiler kullanmaya başlamak istiyorum. Benim sorum, hangi ana akıllı seçicimin kullanılacağını, benim ana seçimlerimin (bence) OpenCV cv::Ptr ya da güçlendirici varyantlardan biri olduğunu düşünüyorum.

Ben number artırmak işaretçiler her biri arasında farklı açıklayan questions arasında var farkındayım ama birileri cv::Ptr onlarla karşılaştıran bir açıklama ve bir ya da diğer herhangi bir öneride umduğunu?

DÜZENLEME - Ptrshared_ptr güçlendirmeye benzer olduğunu fark ettim, hangi kitaplık/dosyalar gerekli olan temel fark nedir?

+3

Standart akıllı işaretçileri kullanmayı düşündünüz mü (C++ 11'e erişiminiz varsa)? C++ 11 kullanıyorsanız, std :: shared_ptr' üzerinde – undu

+0

+1. Aksi takdirde, zaten güçlendirme kullanıyor olsanız da veya güçlendirme kullanmayı planlıyorsanız veya destek kullanarak şeylerle birlikte çalışıp çalışmadığınızı anlayabilirsiniz. Ben cv :: Ptr' yeterince iyi çalıştığından, sadece 'shared_ptr' için destek de dahil olduğunu sanmıyorum. – yiding

+2

Kullandığınız API'ları kullanmaktansa, akıllı göstericinin bu 3 çeşidi mutlaka birbirinin yerine geçemez veya kendi aralarında dönüşüm operatörleri sağlayabilir. Bu nedenle, destek kitaplığının diğer bölümlerini kullanırken std :: shared_ptr 'yerine' boost :: shared_ptr 'uygulamasını kullanmak için genellikle iyi nedenler vardır. Aynı şey OpenCV için de geçerli. – marko

cevap

7

OpenCV belgelerinde görebildiğim için, bu, esasen boost::shared_ptr ile aynı şekilde referans sayılan bir akıllı işaretleyicidir. Hatta referans sayısında atomik işlemler kullanır.

Seçimi taşınabilirlik ve birlikte çalışabilirliğe göre yapıyorum.

  1. sistem edecek mi ama boost başka bir yerde taşıdık ve kesin OpenCV bağlıdır edilecek? Ardından, güçlendirmeyi engelleyebiliyorsanız ve bağımlılıktan kurtulabiliyorsanız OpenCV cv::Ptr'a yapıştırın.

  2. boost::shared_ptr, OpenCV'nin geri kalanında güzel oynar mı? OpenCV kitaplığından bir cv :: Ptr döndüren bir şey varsa, bu durumlarda cv :: Ptr öğesine yapıştırmak daha iyidir, çünkü her iki işaretçiyi de karıştırırsanız kaynak yanlış sayılır ve kaynak yok edilebilir. zamanından önce.

  3. Projeyi nereye yüklediğiniz her yerde boost'a sadık kalacaksınız? Daha sonra, bunu yapabileceğiniz zaman boost::shared_ptr'a yapıştırın, daha standarttır, insanlar bunu biliyor ve kodunuzu hemen anlayacaktır. GÜNCELLEŞTİRME: C++ 11'de, bunu karşılayabiliyorsanız hiçbir bağımlılık olmayan std :: shared_ptr var, bu durumda std :: shared_ptr'yi kullanabilir ve aynı zamanda destekten de kurtulabilirsiniz.

Sadece bir yan not olarak, destek karıştırın ve doğru etrafında referansı tutabilir ve birisi için yararlı olabilecek ortak işaretçileri std için bir tekniği vardır. Bu soruya bakın, diğer referans sayılan işaretleyicileri karıştırmak için de kullanılabilir: Conversion from boost::shared_ptr to std::shared_ptr?

Bir şeyleri yüklediğinizde, daha az bağımlılık, daha iyi veya derlemenin yapılabileceği belirli platformlar var. bir cehennem. Dolayısıyla, kütüphaneler ile işaretçilerin bir ilgisi ve birlikte çalışabilirliği söz konusu olduğunda, seçiminizi taşınabilirliğe göre yapın.

+2

Gelecek okuyucular için: C++ 11'de std :: shared_ptr ifadesinin kullanılmasıyla bu cevabın bir kısmı muhtemelen ortadan kaldırılmıştır: Eğer bunu “boost :: shared_ptr” yerine kullanırsanız, üçüncü nokta hiçbir şekilde geçerli değildir. Daha. Ama cevabın geri kalanı hala geçerli! – anderas

+0

Soruyu, C++ 11'de std :: shared_ptr öğesini ve referans sayımlarını yansıtacak şekilde güncelledim. –