这意味着内存被分配为单个块。这在谈论容器时最常使用。
例如,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
Run Code Online (Sandbox Code Playgroud)
另一方面,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
Run Code Online (Sandbox Code Playgroud)
非连续数据结构的另一个例子是链表。对于链表,增加头指针会返回第二个元素几乎是不可想象的。
它很少相关,假设您使用 C++ 良好实践,例如尽可能多地使用迭代器而不是指针,因为它允许集合管理它们如何存储它们的项目,而不必担心它们是如何存储的。通常,如果必须从 C++ 代码中调用 C 代码,则需要内存是连续的,因为大多数 C 函数都设计为使用连续内存,因为这是最简单的方法。