2011-10-08 46 views
5

AFAIK,boost::compressed_pair應該確保第一個和第二個memebrs的地址是不同的,同時它實現了壓縮該對的魔力。它說如此here。似乎不是這樣,它的行爲在不同的編譯器上是不同的。我正在使用boost v 1.47。我錯過了什麼?boost compressed_pa​​ir和空對象的地址

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()); 

回答

5

當類型是不同的,並且所述類型的一個或兩者是一個空類,子對象都應該是在同一地址(如果編譯器可以將空基類優化關),這就是壓縮對的點。

當類型是相同的,我想從第10章中所述的標準的說明適用:

甲基類的子對象可以是零大小(第9)的;然而,兩個 具有相同類類型且屬於同一個 大多數派生對象的子對象不得在同一地址(5.10)處分配。

因此,它似乎取決於編譯器,以確保它們分配在不同的地址(和VC10可能會弄錯它)。

boost的頭文件中的註釋表明,早些時候他們根本沒有打算在壓縮對中放入同一個空類的兩個不同實例。相反,他們只存儲了一個實例,並且first()second()都返回了相同的對象。

// 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).