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.
Nguồn
2013-04-24 18:24:10
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
@ GRAYgoose124: Chỉ cần một, tối ưu hóa cơ sở _empty_. –
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