是在test1
和test2
相同的內存佈局的?差異對載體和含有兩個元件結構的矢量的存儲器佈局 - C++/STL
std::vector<std::pair<int,int> > test1;
std::vector<mystruct> test2;
其中如MYSTRUCT定義:
struct mystruct{
int a;
int b;
};
是在test1
和test2
相同的內存佈局的?差異對載體和含有兩個元件結構的矢量的存儲器佈局 - C++/STL
std::vector<std::pair<int,int> > test1;
std::vector<mystruct> test2;
其中如MYSTRUCT定義:
struct mystruct{
int a;
int b;
};
在邏輯上,std::pair<int, int>
應當這樣也限定。
然而,有關於什麼的標準,它是完全無擔保。你可以看看編譯器中的頭文件來確認,但這並不能證明什麼。
注意:如果您認爲否則它是荒謬的,我可以給你一個例子,如何可以定義,否則。想象一下,在其他使用std::pair
的stl模板類中,他們覺得它會很方便(出於任何原因),以便在該對中有指向包含該對的節點的指針。這樣,他們可以在內部添加一個指向pair類的指針,同時不違反任何規則。然後你的假設會造成破壞。我認爲他們不太可能做這樣的事情,是的,但只要他們不被迫進行這種佈局,任何事情都可能發生。
如果您在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) 性病採用了大量的額外調試的東西。這使得調試和發佈模式下類的大小不同。所以很可能std :: pair在調試模式下更大。
2) 性病可能會在內部改變。不能保證std :: pair不會改變它在不同std版本中的內存佈局。所以,如果你依靠這一點,你必須忍受有一天它可能無法工作的恐懼。
在任何合理的實施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); }
};
從理論上講,但不能保證,我想 – 2011-12-15 20:59:39