C ++指针指针大小

时间:2017-11-12 22:07:09

标签: c++ pointers memory

我有以下代码:

int main() {
  int N = 1000000;
  int D = 1;

  double **POINTS = new double * [N];
  for (unsigned i=0;i<=N-1;i++) POINTS[i] = new double [D];
  for (unsigned j=0;j<=D-1;j++) POINTS[0][j] = 0;

  for (int i = 0; i < N; ++i)
  {
    for (int j = 0; j < D; ++j)
    {
        POINTS[i][j] = 3.14;
    }
  }
}

如果每个pointer的尺寸为8以及N = 10^6D = 1,则预计POINTS的尺寸必须为8 * 10^6 * 1 / 1000 / 1000 = 8 mb但事实上这个程序吃了42 mb的记忆。如果N = 2 * 10^6预期为16 mb,则实际为84。为什么呢?

1 个答案:

答案 0 :(得分:3)

有很多可能的原因:

  • 每次内存分配都可能带来一些开销,因此内存管理器可以跟踪事情。很多小的分配(就像你有的那样)意味着你在开销方面可能比在数据方面有更多的限制。
  • 记忆通常出现在&#34;页面&#34;。如果您动态分配1个字节,那么您的大小可能会增加1页的大小。 (第一次 - 不是每1个字节的分配都会给你一个全新的页面)
  • 对象可能已应用填充。如果你分配一个字节,它可能会被填充到&#34;字大小&#34;所以你使用的比你想象的要多
  • 当您分配和释放对象时,您可以创建&#34; hole&#34; (碎片)。你想要8个字节,但这个页面只有4个字节的漏洞?您将获得一个全新的页面。

简而言之,没有简单的方法来解释为什么你的程序使用的内存比你想象的要多,除非你遇到问题,否则你可能不应该关心。如果你遇到问题&#34; valgrind&#34;和类似的工具将帮助您找到它们。

最后一点:动态分配的2d数组是创建上述问题的最简单方法之一。