2012-11-14 28 views
5

Điều này có vẻ lạ, nhưng tôi sẽ cố gắng hợp lý hoá nó. Tôi hiện đang sử dụng boost.object_pool rộng rãi cùng với shared_ptr và gần đây tôi gặp phải tình huống mà tôi cần chụp nhanh các trạng thái chương trình hiện tại, để thực hiện chức năng như toàn màn hình phát lại/quay lại/tua nhanh. Vì vậy, tôi không cố gắng sao chép một nhóm đối tượng để sử dụng ở nơi khác, điều đó sẽ không hoạt động rõ ràng bởi vì ngay cả khi tôi được phép làm như vậy bằng giao diện của boost.pool (mà tôi không có), sẽ không có giá trị con trỏ trỏ đến các khối trong hồ bơi mới được nhân bản và nó sẽ là vô nghĩa. Nhưng trường hợp sử dụng của tôi ở đây là tôi muốn "dán" nó trở lại hồ bơi ban đầu nếu có nhu cầu phát lại/quay lại. Tôi chắc chắn chỉ có thể sao chép và sao chép tất cả các tiểu bang, đối tượng và tiểu bang, tiểu đối tượng và subsub ... theo cách thủ công và sau đó đóng gói chúng thành ảnh chụp nhanh và hy vọng mọi thứ sẽ đúng, nhưng đó là lỗi- dễ bị sự phức tạp mà dự án đã có, và nó phải chậm hơn rất nhiều so với nếu tôi chỉ có thể sao chép trực tiếp bộ nhớ. Sử dụng mẫu Command (hoặc tương tự) để đạt được undo-redo là khá ra khỏi câu hỏi là tốt vì cơ chế undo-redo không phải là ý định của tôi.Bất kỳ việc tạo nhóm đối tượng clonable nào trong C hoặc C++?

Tôi đã tự hỏi liệu tôi có thực hiện dự án từ đầu một lần nữa bằng cách sử dụng cách truyền thống C cứng hay không, và một cuộc gọi memcpy đơn giản (snapshot, all_states, size) sẽ thực hiện hầu như tất cả công việc.

Tôi còn thiếu tùy chọn nào khác không? Có boost.object_pool như thực hiện cho phép bạn sao chép khu vực bộ nhớ cơ bản? Là intrusively hack boost.object_pool một lựa chọn hợp lý xem xét tình hình?

+0

Viết hồ bơi đối tượng, có thể sao chép, riêng của bạn với giao diện tương tự dường như không khó khăn hoặc tốn thời gian. – Pubby

+0

@Pubby: cấu trúc giống như đồ thị không bao giờ dễ dàng sao chép. Lỗi phổ biến nhất đang gặp khó khăn trong một chu kỳ vô hạn và vô tình phá vỡ đồ thị. Đó là địa ngục để gỡ lỗi quá. –

Trả lời

2

Không phải là tôi biết.

Như bạn đã lưu ý, vấn đề chính ở đây là sự hiện diện của các phụ thuộc có thể giữa các đối tượng yêu cầu cập nhật các con trỏ khi bạn tạo bản sao. Chắc chắn không tầm thường.

tôi có thể nghĩ đến hai giải pháp khả thi:

  • Persistency
  • serialization

Persistency được khoảng không bao giờ biến đổi trạng thái hiện tại. Khi bạn thay đổi trạng thái, do đó bạn tạo một ảnh chụp nhanh mới đề cập đến trạng thái cũ ngoại trừ các bit mới. Nó thường được sử dụng trong việc triển khai cơ sở dữ liệu của MVCC, ví dụ, và phổ biến trong thế giới lập trình chức năng. Nó cũng là một cách tốt để có được rò rỉ không gian nếu bạn cố gắng và giữ quá nhiều tài liệu tham khảo. Cuối cùng, nó đòi hỏi một kỹ thuật tái sâu.

Nối tiếp là trạng thái bền bỉ, nhưng ở định dạng khác. Bạn đổ trạng thái hiện tại của bạn ở định dạng tuần tự (cho dù là văn bản hay nhị phân), và bạn có thể tạo lại nó bằng cách đọc bộ đệm tuần tự hóa. Bạn thậm chí có thể áp dụng một vượt qua nén trên bộ đệm serialized để phụ tùng một số bộ nhớ.

Vì bạn đang sử dụng Boost, hãy vui lòng biết rằng Boost.Serialization sẽ tự động xử lý đồ thị của các đối tượng (eh!) Và tôi nghĩ đã giao dịch chính xác với boost::shared_ptr. Nó có thể là lựa chọn tốt nhất của bạn ở đây.