【发布时间】:2012-08-01 05:10:54
【问题描述】:
C++中连续内存是什么意思?
【问题讨论】:
-
你的意思是连续内存吗?
C++中连续内存是什么意思?
【问题讨论】:
这意味着内存被分配为单个块。这在谈论容器时最常使用。
例如,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 函数都设计为使用连续内存,因为这是最简单的方法。
【讨论】:
如果你写下面的语句
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
它们不是连续的。就是这样
【讨论】:
首先,连续内存是指分配的一块内存,其占用的地址没有任何间隙。这将是一个单一的内存“块”。
C++ 中的连续内存意味着在 C++ 中分配连续内存的各种方式。一种简单的方法是 C 中的数组
int a[10]
std::vector 和 std::array (C++11) 等 STL 容器也会分配连续内存。
【讨论】:
Continuous Memory的意思是连续记忆。 当大块内存被保留或分配时,该内存块称为连续内存块。
【讨论】: