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

Posted

技术标签:

【中文标题】C ++中连续内存的含义是啥?【英文标题】:What is the meaning of contiguous memory in C++?C ++中连续内存的含义是什么? 【发布时间】:2012-08-01 05:10:54 【问题描述】:

C++中连续内存是什么意思?

【问题讨论】:

你的意思是连续内存吗? 【参考方案1】:

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

例如,vectorstring 类使用连续的内存块。这意味着如果您有一个包含int 元素123456789 的向量,那么您可以放心,如果您获得指向向量第一个元素的指针,通过递增此指针,您将访问第二个元素 (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::vectorstd::array (C++11) 等 STL 容器也会分配连续内存。

【讨论】:

【参考方案4】:

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

【讨论】:

以上是关于C ++中连续内存的含义是啥?的主要内容,如果未能解决你的问题,请参考以下文章

C语言中“指针”和“指针变量”的区别是啥??

C和内存访问延迟中的连续内存分配

数组的存储方式是啥?

C语言中的动态内存分配的用法举例

在 C 标准库中使用内存流的目的是啥?

用于连续内存的 std::array 与 C 样式数组