2011-10-08 29 views
5

AFAIK, boost::compressed_pair được cho là đảm bảo rằng địa chỉ của các ký ức đầu tiên và thứ hai khác nhau trong khi nó thực hiện phép thuật nén cặp. Nó nói như vậy here. Có vẻ như nó không phải là trường hợp và hành vi của nó là khác nhau trên trình biên dịch khác nhau. Tôi đang sử dụng boost v 1.47. Tôi đang thiếu gì?tăng nén_pair và địa chỉ của các đối tượng trống

struct E1 {}; 
struct E2 {}; 

boost::compressed_pair<E1, E2> diff_pair; 
boost::compressed_pair<E1, E1> same_pair; 

// clang++ and g++ 4.7 print the same address but VC2010 prints different addresses. 
printf("different pairs = %p, %p\n", &diff_pair.first(), &diff_pair.second()); 

// clang++ and g++ 4.7 print different addresses but VC2010 prints the same address. 
printf("different pairs = %p, %p\n", &same_pair.first(), &same_pair.second()); 

Trả lời

5

Khi các loại khác nhau và một hoặc cả hai loại là một lớp học trống, subobjects có nghĩa vụ phải được ở cùng một địa chỉ (nếu trình biên dịch có thể kéo tối ưu hóa lớp cơ sở có sản phẩm nào off), đó là điểm của cặp được nén.

Khi các loại đều giống nhau, tôi nghĩ rằng một lưu ý từ chương 10 trong tiêu chuẩn áp dụng:

Một cơ sở lớp subobject có thể của zero kích thước (khoản 9); tuy nhiên, hai đối tượng con số có cùng loại lớp và thuộc cùng một đối tượng không được cấp phát tại cùng một địa chỉ (5.10).

Vì vậy, có vẻ như tùy thuộc vào trình biên dịch để đảm bảo rằng chúng được phân bổ tại các địa chỉ khác nhau (và VC10 có thể bị sai).

Nhận xét trong tiêu đề của tăng cho biết, trước đó họ không bận tâm đặt hai trường hợp khác nhau của cùng một lớp trống trong cặp nén. Thay vào đó, họ chỉ lưu trữ một cá thể và cả hai số first()second() trả về cùng một đối tượng.

// 4 T1 == T2, T1 and T2 both empty 
    //  Originally this did not store an instance of T2 at all 
    //  but that led to problems beause it meant &x.first() == &x.second() 
    //  which is not true for any other kind of pair, so now we store an instance 
    //  of T2 just in case the user is relying on first() and second() returning 
    //  different objects (albeit both empty). 
Các vấn đề liên quan