2012-11-10 34 views
9

Evidentlyhold_any có hiệu suất tốt hơn boost::any. Làm thế nào để nó quản lý để làm điều này?Làm thế nào để tăng :: tinh thần :: hold_any làm việc?

Chỉnh sửa: Cảm ơn nhận xét của Mat, tôi đã tìm thấy một số answer by hkaiser về hold_any ở một câu hỏi khác nhưng thiếu chi tiết. Một câu trả lời chi tiết hơn sẽ được hoan nghênh.

+0

Bạn có đọc bài đăng Chồng tràn không được liên kết từ bài viết đó không? – Mat

+1

Bạn đã nghe nói về "thành ngữ tối ưu hóa đối tượng nhỏ" trong ngữ cảnh của các lớp con trỏ giả ngữ ngữ nghĩa giá trị, như chuỗi std? – Yakk

Trả lời

1

Tôi nghĩ một trong những lý do là vì tăng :: hold_any sử dụng phương pháp tiếp cận lập trình meta mẫu trong khi tăng :: bất kỳ cách nào sử dụng phương pháp kế thừa.

Bên trong, tăng :: cửa hàng tinh thần :: hold_any "giá trị" bằng cách sử dụng void * và sử dụng đối tượng khác để theo dõi các thông tin kiểu dữ liệu:

>> boost/spirit/home/support/detail/hold_any.hpp 
template <typename Char> 
class basic_hold_any 
{ 
    .... 
    spirit::detail::fxn_ptr_table<Char>* table; 
    void* object; 
    ... 
} 

boost :: bất kỳ cửa hàng "giá trị "sử dụng một người giữ, và nó không cần một đối tượng khác để theo dõi các thông tin kiểu dữ liệu. Chủ sở hữu được kế thừa từ trình giữ chỗ và do đó có các hạn chế thừa kế.

>> boost/any.hpp 
class any 
{ 
    ... 
    placeholder * content; 
    ... 
} 


class placeholder 
template<typename ValueType> 
class holder : public placeholder 
{ 
    ... 
    ValueType held; 
    ... 
} 

... sự khác biệt Biến là nhiều hơn nữa về gọi constructor và destructor, nhưng ngay cả đối với đúc, thúc đẩy tinh thần :: :: hold_any nên nhanh hơn.

1

hold_any thực hiện hai tối ưu hóa: 1. Đối với các đối tượng nhỏ, nó không cấp phát bộ nhớ cho chủ thể đối tượng nhưng lưu trữ trực tiếp trong bộ nhớ con trỏ; 2. Không sử dụng so sánh loại RTTI (chậm) nhưng sử dụng bảng loại riêng

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