C ++中连续内存的含义是什么?
答案 0 :(得分:4)
这意味着内存被分配为单个块。这在谈论容器时最常用。
例如,vector
和string
类使用连续的内存块。这意味着如果您的向量包含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
另一方面,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函数都设计为使用连续内存,因为这是最简单的方法。
答案 1 :(得分:2)
如果你写下面的陈述
int arr[3];
然后你要保留3个整数类型的连续存储单元。因此,如果我们说整数在内存中保留4个字节,并且第一个存储单元的地址是1000,那么
内存中arr [0]的地址为1000
内存中arr [1]的地址为1004
内存中arr [2]的地址是1008
它们是一个接一个地连续着。但是,如果你只是写
int a,b,c;
你正在保留非连续的存储单元。所以“a”的地址可能远离b和c。例如
内存地址为1000
内存中b的地址是2014
内存中c的地址是2234
它们不是连续的。这就是全部
答案 2 :(得分:1)
首先,连续内存意味着分配的内存块在其占用的地址中没有任何间隙。它将是一个单独的“块”记忆。
C ++中的连续内存意味着在C ++中分配连续内存的各种方式。一种简单的方法是在C
中的数组 int a[10]
std::vector
和std::array
(C ++ 11)等STL容器也会分配连续的内存。
答案 3 :(得分:1)
连续内存的含义是连续内存。 保留或分配大内存块后,该内存块称为连续内存块。