2011-12-15 26 views

回答

3

在邏輯上,std::pair<int, int>應當這樣也限定。

然而,有關於什麼的標準,它是完全無擔保。你可以看看編譯器中的頭文件來確認,但這並不能證明什麼。

注意:如果您認爲否則它是荒謬的,我可以給你一個例子,如何可以定義,否則。想象一下,在其他使用std::pair的stl模板類中,他們覺得它會很方便(出於任何原因),以便在該對中有指向包含該對的節點的指針。這樣,他們可以在內部添加一個指向pair類的指針,同時不違反任何規則。然後你的假設會造成破壞。我認爲他們不太可能做這樣的事情,是的,但只要他們不被迫進行這種佈局,任何事情都可能發生。

2

如果您在cplusplus.com看,你會看到,這是一對的結構:

template <class T1, class T2> struct pair 
{ 
    typedef T1 first_type; 
    typedef T2 second_type; 

    T1 first; 
    T2 second; 
    pair() : first(T1()), second(T2()) {} 
    pair(const T1& x, const T2& y) : first(x), second(y) {} 
    template <class U, class V> 
    pair (const pair<U,V> &p) : first(p.first), second(p.second) { } 
} 

完全一樣的,我會說,除了一些事實: 好了,開始用對與std容器兼容的事實,例如地圖。 另外,這些對已經制作好了,並且已經有了你的構造函數。

編輯: 我也忘了提到你會爲你提供std :: make_pair,它允許你跳過分配內存和在結構中創建自己的對,並且你也有一些比較和賦值操作符定義。

1

是的,至少在發佈模式下它會是相同的大小。

你不應該利用這些知識雖然做了一些記憶掛羊頭賣狗肉,有兩個原因:

1) 性病採用了大量的額外調試的東西。這使得調試和發佈模式下類的大小不同。所以很可能std :: pair在調試模式下更大。

2) 性病可能會在內部改變。不能保證std :: pair不會改變它在不同std版本中的內存佈局。所以,如果你依靠這一點,你必須忍受有一天它可能無法工作的恐懼。

1

在任何合理的實施std::pair他們將有相同的佈局。但這引出了它爲什麼重要的問題?你不應該從一個到另一個進行二進制分配。

您可以添加一個拷貝構造函數的結構,直接或通過繼承它。您也可以添加一個方法,以相反的方式進行轉換。

struct mystruct{ 
    int a; 
    int b; 

    mystruct(const std::pair<int,int> &rhs) { a=rhs.first; b=rhs.second; } 
    std::pair<int,int> as_pair() { return std::make_pair(a, b); } 
};