2015-02-08 97 views
0

可能有人確認之間的差:陣列VS矢量,存儲器佈局

class A{ 
    public: 
     std::vector<int> a; 
     std::vector<int> b; 
}; 

class B{ 
    public: 
     std::array<int, 1000> a; 
     std::array<int, 1000> b; 
}; 

A該對象包含兩個指針到兩個隨機分配區域在堆上?

相比之下,第二類對象將具有連續的內存分配(取決於對象的位置 - 堆棧或堆),這將是連續的。這些數組將會彼此相鄰(類A不會出現這種情況)?

+3

基本上,是的,雖然a)'std :: vector'通常會存儲多個單個指針,並且b)不能保證'B :: a'和'B :: b'不會有填充(儘管在實踐中很可能是這種情況)。 – 2015-02-08 22:41:24

+0

是的,這是正確的。 – 2015-02-08 22:41:36

+0

此外,矢量將其數據存儲在連續的內存塊中以及... – 2015-02-08 22:43:13

回答

1

每個class A一個實例內的矢量實例將包含沿的三個指針的線[或兩個指針和一個size_t又名std::vector::size_type,或一個指針和兩個size_t]東西。存儲在std::vector<int> a, b中的lements將從堆中分配。內容ab遠不能保證彼此接近。 ab中的每個元素都將被連續存儲,因此除了額外的指針解引用外,例如兩個解決方案之間的緩存局部性將非常相似。

但是,如果你在一個新的堆做類似

A x; 
x.a.resize(1000); 
x.b.resize(1000); 

,有機會,ab確實不是很遠。

在B的情況下,將會有兩個數組,每個數組足夠1000個整數,可能在它們之間有一些填充。除了填充之外,數組將彼此相鄰。