2012-11-13 36 views
8

Tôi chỉ tò mò về việc thực hiện boost::variant.boost :: thực hiện biến thể

Ứng dụng có hoạt động như thế này không?

Hai thành viên:

  1. Một số đại diện cho các loại hiện được lưu trữ (tức là 0 cho tham số mẫu đầu tiên, 1 cho tham số mẫu thứ hai vv)
  2. Một đoàn của tất cả các loại có thể (trong đó tất nhiên kích thước lớn nhất).

apply_visitor():

Có một tuyên bố switch vào số lượng đại diện cho các loại hiện được lưu trữ để gọi tình trạng quá tải đúng (điều này sẽ trong trường hợp tồi tệ hơn được biên dịch như bảng nhảy rất mất thời gian liên tục).

Tôi hiểu rằng cũng có một số tối ưu hóa có thể chắc chắn boost::variant không cần phân bổ động bộ nhớ như chi tiết here, nhưng tôi nghĩ rằng tôi nhận được những điều này.

+0

Bạn thực sự có thể xem mã nguồn và thậm chí tài liệu có thể cho biết cách triển khai. Tôi mong đợi một bộ đệm (mảng char đủ loại) và một thẻ để xác định cách giải thích bộ đệm. –

+1

Xin lỗi trước, nhưng bạn đã xem xét mã nguồn, đúng không? Bạn sẽ có thể tìm ra chính xác cách thức hoạt động của nó, hoặc bằng cách nghiên cứu các nguồn, hoặc xây dựng một ứng dụng thử nghiệm và bước qua với một trình gỡ rối, không? – Bukes

Trả lời

7

Nó hoạt động khá nhiều theo cách bạn mô tả. Dài câu chuyện ngắn:

  1. Nó có số nguyên which cho biết loại dữ liệu nào được sử dụng.

  2. Bộ nhớ được triển khai bằng cách sử dụng số tăng aligned_storage về cơ bản là bộ đệm có kích thước dữ liệu tối đa. (Đó là trong một liên minh, nhưng đối với các mục đích liên kết)

Cuối cùng, người truy cập thực sự là thực hiện với một switch, tạo ra tại thời gian biên dịch sử dụng các macro để cuộn cho tất cả các khả năng loại.

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