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

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

【问题讨论】:

  • 你的意思是连续内存吗?

标签: c++ memory


【解决方案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的意思是连续记忆。 当大块内存被保留或分配时,该内存块称为连续内存块。

        【讨论】:

          猜你喜欢
          • 2011-05-02
          • 2017-01-19
          • 2015-01-18
          • 1970-01-01
          • 2014-10-29
          • 1970-01-01
          • 1970-01-01
          • 2013-12-31
          相关资源
          最近更新 更多