7

C ++中连续内存的含义是什么?

4

4 回答 4

9

这意味着内存被分配为单个块。这在谈论容器时最常使用。

例如,vectorandstring类使用一块连续的内存。这意味着如果您有一个包含int元素123, 456,的向量789,那么您可以放心,如果您获得指向向量第一个元素的指针,通过递增该指针,您将访问第二个元素 (456),并通过再次增加它,您将访问最后一个元素(789)。

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

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

另一方面,双端队列类不保证连续存储。这意味着,如果您有一个包含相同元素(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 函数都设计为使用连续内存,因为这是最简单的方法。

于 2012-08-01T05:14:01.953 回答
3

如果你写下面的语句

int arr[3];

那么您将保留 3 个连续的整数类型的内存单元。所以如果我们说整数在内存中保留4个字节,第一个内存单元的地址是1000,那么

arr[0]在内存中的地址是1000

arr[1]在内存中的地址是1004

arr[2]在内存中的地址是1008

它们是连续的,一个接一个。但如果你只是写

int a,b,c;

您正在保留不连续的内存单元。所以“a”的地址可能远离b和c。例如

a在内存中的地址是1000

b在内存中的地址是2014

c在内存中的地址是2234

它们不是连续的。就这样

于 2012-08-01T05:19:57.190 回答
1

首先,连续内存是指分配的一块内存,其占用的地址没有任何间隙。这将是一个单一的内存“块”。

C++ 中的连续内存意味着在 C++ 中分配连续内存的各种方式。一种简单的方法是 C 中的数组

int a[10]

std::vector和(C++11)之类的 STL 容器std::array也会分配连续内存。

于 2012-08-01T05:29:21.467 回答
1

Continuous Memory的意思是连续记忆。当保留或分配大块内存时,该内存块称为连续内存块。

于 2019-06-20T05:32:44.053 回答