当前位置: 首页 > 面试题库 >

为什么连续调用new []不分配连续内存?

向修谨
2023-03-14
问题内容

我正在使用Ubuntu 14.04 64位。这是我的C ++代码,以了解如何使用内存。

int main() {
  int **ptr;

  ptr = new int* [2];
  cout << &ptr << " -> " << ptr << endl;

  for (int r = 1; r <= 2; r++) {
    ptr[r-1] = new int [2 * r];
    cout << &ptr[r-1] << " -> " << ptr[r-1] << endl;

    for (int c = 0; c < 2 * r; c++) {       
        ptr[r-1][c] = r * c;
        cout << &ptr[r-1][c] << " -> " << ptr[r-1][c] << endl;
    }
  }

  return 0;
}

这是我的输出:

0x7fff09faf018 -> 0x1195010
0x1195010 -> 0x1195030
0x1195030 -> 0
0x1195034 -> 1
0x1195018 -> 0x1195050
0x1195050 -> 0
0x1195054 -> 2
0x1195058 -> 4
0x119505c -> 6

我希望操作系统会连续分配内存。因此,ptr [0]
[0]将位于0x1195020而不是0x1195030!OS在0x1195020-0x119502F,0x1195038-0x0x119504F上做什么用?


问题答案:

因为:

  1. 在分配的内存的每个块的开始和结尾处都有一些空间通常用于簿记。(特别是,许多分配器发现在其附近存储前/后块的大小或指向它们的指针很有用。)

  2. 内存分配器可以“舍入”已分配块的大小,以使事情变得更容易。例如,分配的7个字节可能会舍入为8个字节,即使不是16或32。

  3. 内存块可能已经在不连续的位置中可用。(请记住,C运行时可能main()甚至在运行之前就已经对其进行了一些内存分配。)

  4. 分配器可能会考虑规划内存的计划,该计划可能由于将下一个块放在“下一个”地址而损坏。(例如,它可能已保留该内存用于特定大小的分配。)

  5. 为什么要这样 没有任何保证。分配的内存可能会终止在任何地方。(好吧,几乎。)不要做任何假设,只要让内存转到分配器表示将要到达的位置,就可以了。



 类似资料:
  • 如果将块分配给文件,使得文件的所有逻辑块都得到硬盘中的连续物理块,则这种分配方案被称为连续分配。 在下面显示的图像中,目录中有三个文件。 表中提到了起始块和每个文件的长度。 我们可以在表格中检查连续块是否按照需要分配给每个文件。 优点 实现起来很简单。 可获得优秀的读取性能。 支持随机访问文件。 缺点 磁盘将变成碎片。 文件增长可能很困难。

  • 本文向大家介绍连续和非连续内存分配之间的区别,包括了连续和非连续内存分配之间的区别的使用技巧和注意事项,需要的朋友参考一下 在这篇文章中,我们将了解连续和非连续内存分配之间的区别- 连续内存分配 在这种分配类型中,连续的内存块被分配给一个文件/进程。 与不连续的内存相比,它执行得更快。 易于通过操作系统进行控制。 开销最小,因为在执行进程时地址转换不多。 连续内存分配中存在内部碎片。 有不同类型的

  • 多个axios请求怎么按顺序实现?我写的是哪里出问题了,打印的res值都是来自第一个post请求的返回结果,第二个get请求里的res值没有获取到? 把第二个then放里面也是一样, 前端新手,请多指教

  • 问题内容: 在有关reshape()函数的numpy手册中,它说 我的问题是: 什么是连续和不连续数组?它类似于C中的连续内存块,例如什么是连续内存块? 两者之间在性能上有什么区别吗?我们什么时候应该使用其中一个? 为什么转置会使数组不连续? 为什么会c.shape = (20)引发错误incompatible shape for a non-contiguous array? 感谢您的回答! 问

  • 问题内容: 我有一个按钮,该按钮调用animateWithDuration代码,以淡出图像,淡入文本和in的新bg颜色,然后将其重置为正常值。动画需要几秒钟才能完成,效果很好。 然而! 有一个问题: 有时在动画结束之前会再次按下此按钮。发生这种情况时,我希望当前的动画停止并重新开始。 研究解决方案不起作用 根据我的阅读,解决方案应该很简单,只需导入QuartzCore并添加: 这确实删除了动画,但

  • 问题内容: 有没有办法从linux中的用户空间分配连续的物理内存?至少有几个保证的连续内存页。一个巨大的页面不是答案。 问题答案: 不,那里没有。您 确实 需要在内核空间中执行此操作。 如果您说“我们需要从用户空间执行此操作”-没有在内核空间中进行任何操作,那没有什么意义-因为用户空间程序无法控制 甚至不知道 底层内存是否连续。 您需要执行此操作的唯一原因-是与某个硬件或其他需要此要求的低层(即内