[英]What is the meaning of contiguous memory in 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。 例如
内存中的地址是1000
内存中b的地址是2014
内存中c的地址是2234
它们不是连续的。 就这样
首先,连续内存意味着分配的内存块在其占用的地址中没有任何间隙。 它将是一个单独的“块”内存。
C ++中的连续内存意味着在C ++中分配连续内存的各种方式。 一种简单的方法是C中的数组
int a[10]
像std::vector
和std::array
(C ++ 11)这样的STL容器也会分配连续的内存。
连续记忆的意义是连续记忆。 当保留或分配大块内存时,该内存块称为连续内存块。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.