2012-08-01 41 views

回答

4

這意味着內存被分配爲一個塊。談論容器時,這是最常用的。

例如,vectorstring類使用連續的內存塊。這意味着如果你有一個包含int元素的矢量123,456,789,那麼你可以放心,如果你得到指向矢量第一個元素的指針,通過增加這個指針,你將訪問第二個元素(456),然後再次遞增,您將訪問最後一個元素(789)。

std::vector<int> vec = {123, 456, 789}; 

int* ptr = &vec[0]; 
*ptr++ == 132; // true 
*ptr++ == 456; // true 
*ptr++ == 789; // true 

另一方面,deque類不保證連續存儲。這意味着如果你有一個包含相同元素(123,456,789)的雙端隊列,並且你得到一個指向第一個元素的指針,那麼你不能確定你將通過遞增指針來訪問第二個元素,或者第三次再次遞增。

std::deque<int> deque = {123, 456, 789}; 

int* ptr = &deque[0]; 
*ptr++ == 132; // true 
*ptr++ == 456; // not necessarily true and potentially dangerous 
*ptr++ == 789; // not necessarily true and potentially dangerous 

非連續數據結構的另一個例子是鏈表。使用鏈表時,增加頭指針可能返回第二個元素幾乎是不可想象的。

假設您使用C++良好實踐(例如儘可能多地使用迭代器而不是指針),因爲它允許集合管理他們如何存儲其項目,而無需擔心他們如何執行操作,所以很少有相關性。通常,如果必須從C++代碼調用C代碼,則需要內存連續,因爲大多數C函數都設計爲使用連續內存,因爲這是實現它的最簡單方法。

2

如果你寫下面的語句

int arr[3]; 

那麼你預留類型整數的3個連續的存儲單元。因此,如果我們說,整數儲量4個字節在存儲器中,並且是第一存儲單元的地址1000,然後

ARR [0]中存儲的地址爲1000

ARR的地址[1]在存儲器1004個是

[2]在存儲器是1008

它們是連續的,一個接一個的ARR的地址。但如果你只寫

int a,b,c; 

你保留非連續的記憶細胞。所以「a」的地址可能遠離b和c。例如

的在存儲器中的地址是1000

B在存儲器中的地址是2014

C在存儲器中的地址是2234

它們是不連續的。這就是全部

1

首先連續的內存意味着分配的一塊內存,沒有任何它佔用的地址空白。這將是一個單一的「塊」內存。

C++中的連續內存意味着在C++中分配連續內存的各種方式。一種簡單方式是陣列與在C

int a[10]

STL容器等std::vectorstd::array(C++ 11)也將分配連續的存儲器。

相關問題