2012-12-19 41 views
7

Tôi có một dự án xử lý hình ảnh mở rộng dựa trên thư viện OpenCV cho nhiều chức năng của nó, mặc dù tôi cũng sử dụng một vài chức năng tăng cường.OpenCV hoặc Boost con trỏ thông minh

Tôi muốn bắt đầu sử dụng con trỏ thông minh để thay thế một số con trỏ thô đang bắt đầu gây ra sự cố. Câu hỏi của tôi là sử dụng loại con trỏ thông minh nào, với các lựa chọn chính của tôi (tôi nghĩ) là OpenCV cv::Ptr hoặc một trong các biến thể tăng cường.

Tôi nhận thấy có một number của questions giải thích sự khác nhau giữa mỗi người trong số các con trỏ tăng, nhưng tôi hy vọng ai đó có thể cung cấp một giải thích về cách cv::Ptr so sánh với họ và thực hiện bất kỳ kiến ​​nghị của một hay khác?

EDIT - Tôi đã nhận thấy từ OpenCV docs rằng Ptr tương tự như tăng shared_ptr, là sự khác biệt cần thiết mà chỉ cần thư viện/tệp được yêu cầu?

+3

Bạn đã cân nhắc sử dụng các con trỏ thông minh tiêu chuẩn (nếu bạn có quyền truy cập C++ 11)? – undu

+0

+1 trên 'std :: shared_ptr' nếu bạn đang sử dụng C++ 11. Nếu không, nó thực sự đi xuống cho dù bạn đã sử dụng tăng hoặc đang có kế hoạch để sử dụng tăng, hoặc tương thích với những thứ bằng cách sử dụng tăng. Tôi không nghĩ rằng nó có giá trị bao gồm cả tăng chỉ cho 'shared_ptr', vì' cv :: Ptr' hoạt động tốt. – yiding

+2

Mà bạn sử dụng sẽ phụ thuộc vào các API bạn đang gọi - 3 hương vị của con trỏ thông minh này không nhất thiết phải hoán đổi cho nhau hoặc cung cấp các toán tử chuyển đổi giữa chúng. Vì lý do này, thường có những lý do tốt để sử dụng triển khai 'boost :: shared_ptr' thay vì' std :: shared_ptr' khi sử dụng các phần khác của thư viện tăng. Điều tương tự cũng có khả năng giữ cho OpenCV. – marko

Trả lời

7

Đối với những gì tôi có thể thấy trong tài liệu OpenCV, đây là con trỏ thông minh được tính tham chiếu, về cơ bản, giống như boost::shared_ptr. Ngay cả khi nó sử dụng các phép toán nguyên tử trên số tham chiếu.

Tôi sẽ thực hiện lựa chọn dựa trên tính di động và khả năng tương tác.

  1. Hệ thống của bạn sẽ được chuyển sang nơi khác và phụ thuộc vào OpenCV chắc chắn chứ không phải trên boost? Sau đó, hãy liên kết với OpenCV cv::Ptr nếu bạn có thể tránh tăng cường và thoát khỏi sự phụ thuộc.

  2. Không boost::shared_ptr có chơi hay với phần còn lại của OpenCV không? Nếu bạn có một cái gì đó trả về cv :: Ptr từ thư viện OpenCV, có lẽ tốt hơn là nên liên kết với cv :: Ptr trong những trường hợp này, vì số tham chiếu sẽ được xử lý không chính xác nếu bạn kết hợp cả hai loại con trỏ và tài nguyên có thể bị phá hủy sớm.

  3. Bạn sẽ dính vào boost bất cứ nơi nào bạn chuyển dự án? Sau đó, hãy gắn bó với boost::shared_ptr khi bạn có thể làm điều đó, nó chuẩn hơn, mọi người biết và sẽ ngay lập tức hiểu mã của bạn. UPDATE: Trong C++ 11 bạn có std :: shared_ptr, mà số tiền không phụ thuộc nếu bạn có thể đủ khả năng đó, vì vậy bạn có thể sử dụng std :: shared_ptr trong trường hợp này và thoát khỏi tăng cũng.

Cũng giống như một lưu ý phụ, có một kỹ thuật kết hợp các con trỏ được chia sẻ và nâng cao có thể giữ tham chiếu chính xác và có thể hữu ích cho ai đó. Xem câu hỏi này, nó cũng có thể liên quan đến việc trộn các loại con trỏ được tính tham khảo khác: Conversion from boost::shared_ptr to std::shared_ptr?

Theo kinh nghiệm của tôi, khi bạn kết nối, ít phụ thuộc hơn, tốt hơn hoặc có một số nền tảng nhất định để biên dịch có thể một địa ngục. Vì vậy, làm cho sự lựa chọn của bạn dựa trên tính di động nếu đó là một mối quan tâm và khả năng tương tác của con trỏ với các thư viện.

+2

Đối với người đọc trong tương lai: Một phần của câu trả lời này có lẽ đã lỗi thời bởi sự ra đời của 'std :: shared_ptr' trong C++ 11: Nếu bạn sử dụng nó thay vì' boost :: shared_ptr', điểm thứ ba không áp dụng bất kỳ hơn. Nhưng phần còn lại của câu trả lời vẫn hợp lệ! – anderas

+0

Tôi đã cập nhật câu hỏi để phản ánh tiêu chuẩn :: shared_ptr trong C++ 11 và trộn số lượng tham chiếu. –

Các vấn đề liên quan