2013-04-24 32 views
7

Tôi đã nhìn thấy cả hai được sử dụng cho cùng một mục đích, nhưng tôi tự hỏi làm thế nào kết quả sẽ khác nhau (nếu ở tất cả) và tại sao điều này được sử dụng ở tất cả.Sự khác biệt giữa một bộ tuple và một nén_pair là gì?

Tham chiếu đến tài liệu: compressed_pairtuple.

+2

std :: pair là một bộ gồm hai phần tử. Các bộ dữ liệu có thể là bất kỳ số phần tử nào (thuộc bất kỳ loại nào). Tôi tưởng tượng các tài liệu trên compress_pair có thể giải thích bất cứ điều gì khác. (Nhưng tôi giả sử nó làm cho một số tối ưu hóa lưu trữ có liên quan) – GRAYgoose124

+0

@ GRAYgoose124: Chỉ cần một, tối ưu hóa cơ sở _empty_. –

+0

Vâng, không phải một tuple đã cung cấp "nén" cần thiết, ngay cả đối với hai yếu tố? – rubenvb

Trả lời

14

C++ yêu cầu tất cả các loại có kích thước lớn hơn 0. Nếu loại có thể có kích thước bằng 0, việc lập chỉ mục mảng và phép toán con trỏ khác sẽ bị xáo trộn.

class EmptyClass { }; 

std::cout << sizeof(EmptyClass); // Prints "1" (typically) 

Một compressed_pair là một tuple của hai yếu tố đó được tối ưu hóa không yêu cầu thêm dung lượng cho một loại mà chỉ có một kích thước của 1 vì kích thước từ 0 cấm.

if (sizeof(compressed_pair<int,EmptyClass>) == sizeof(int)) 
{ 
    std::cout << "EmptyClass was compressed."; // (This will print) 
} 

Điều này đạt được thông qua Empty Base Optimization. Cả hai loại được đặt trong một trình bao bọc lớp và nếu một loại là "trống", thì lớp đó sẽ trở thành cấp độ gốc của lớp kia.

+0

Tại sao bạn lấy kích thước của lớp 'compressed_pair'. Nó không trả về một kiểu mà bạn có thể truy cập bằng ':: [name_of_type]'?… – 0x499602D2

+0

@ 0x499602D2 (Trừ khi tôi bị nhầm lẫn) nó minh họa rằng sự hiện diện của 'EmptyClass' không thêm vào kích thước của' compressed_pair' nói chung. –

+0

Làm thế nào kích thước của 'compression_pair' có cùng kích cỡ với' int' về cơ bản tôi đang cố nói. – 0x499602D2