C ++中连续内存的含义是啥?
Posted
技术标签:
【中文标题】C ++中连续内存的含义是啥?【英文标题】:What is the meaning of contiguous memory in C++?C ++中连续内存的含义是什么? 【发布时间】:2012-08-01 05:10:54 【问题描述】:C++中连续内存是什么意思?
【问题讨论】:
你的意思是连续内存吗? 【参考方案1】:这意味着内存被分配为单个块。这在谈论容器时最常使用。
例如,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 函数都设计为使用连续内存,因为这是最简单的方法。
【讨论】:
【参考方案2】:如果你写下面的语句
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
它们不是连续的。就是这样
【讨论】:
【参考方案3】:首先,连续内存是指分配的一块内存,其占用的地址没有任何间隙。这将是一个单一的内存“块”。
C++ 中的连续内存意味着在 C++ 中分配连续内存的各种方式。一种简单的方法是 C 中的数组
int a[10]
std::vector
和 std::array
(C++11) 等 STL 容器也会分配连续内存。
【讨论】:
【参考方案4】:Continuous Memory的意思是连续记忆。 当大块内存被保留或分配时,该内存块称为连续内存块。
【讨论】:
以上是关于C ++中连续内存的含义是啥?的主要内容,如果未能解决你的问题,请参考以下文章