为什么指针使用的内存多于变量?

时间:2019-01-22 17:43:16

标签: c++ pointers memory memory-management dynamic-memory-allocation

我认为应该使用指针来帮助程序提高内存效率。我不明白为什么“ X”指针比“ Y”变量占用更多的空间。我正在64位Windows计算机上运行此程序。看看这个简单的程序。

#include <iostream>
using namespace std;

int main() {

    // Creating new int
    int *X = new int; *X = 2000000000;
    cout << sizeof(X) << ", " << sizeof(*X) << endl;

    // Deleting the new int
    delete x;
    cout << sizeof(X) << ", " << sizeof(*X) << endl;

    // Using a simple variable
    int Y = 2000000000;
    cout << sizeof(Y);
}

这是我得到的输出:     (8,4),     (8,4),     和4。

有人可以举个例子说明指针实际上如何帮助节省内存吗?

3 个答案:

答案 0 :(得分:1)

  

有人可以举个例子说明指针实际上如何帮助节省内存吗?

它实际上根本没有帮助您节省内存。没有理由认为它应该已经保存了内存。

  

为什么指针使用的内存比变量大?

变量使用(至少)类型所需的内存。类型的大小取决于它需要能够表示多少个不同状态。

例如,int的大小必须至少为16位,以便表示根据语言规则要求表示的所有整数。另一方面,指针必须足够大,以便能够在任何内存地址(可以放置该对象的地址)中指向相应类型的任何对象。在典型的现代系统上,数据指针的大小通常与处理器的字长相同。

结论:指针变量可能比非指针变量大,因为不同的类型具有不同的内存需求,并且某些类型不需要能够表示与指针可能表示的一样多的不同状态。您的示例说明int在您的系统上就是这种类型。

答案 1 :(得分:1)

指针可能有助于节省内存的典型情况的琐碎示例将传递信息。一些功能可能需要访问一些大对象。在这种情况下,传递的对象本身将创建该对象的副本,使第一个对象使用的内存量增加一倍。

  struct Large{ char m_buf[1000]; };

  void foo(Large large) {}

  int main()
  {
        Large large{}; // allocates at least sizeof(Large) bytes ~ 1000 bytes
        foo(large); // allocates at least sizeof(Large) bytes again ~ 1000 bytes
  }

将指针传递给对象只会使内存消耗增加指针的大小。此外,它允许函数修改原始对象而不是副本。

  void foo(Large * p_large) {}

  int main()
  {
        Large large{}; // allocates at least sizeof(Large) bytes ~ 1000 bytes 
        foo(&large); // allocates at least sizeof(Large *) bytes ~ typically 4 or 8 bytes
  }

C ++还为指针-参考提供了更安全的选择。

答案 2 :(得分:-2)

严格来说,指针是需要存储地址的变量。指针需要适当的长度来存储所讨论的地址。地址的长度必须合适。但是,根据类型(包括指针)的不同,变量的长度也可以不同。换句话说,虽然每种类型都有其特定范围的值,但指针必须能够包含该地址。

传递指针以节省空间的一个示例是在连续内存(即原始数组)中。如果您知道彼此相邻的100个整数,则只需将地址传递给第一个整数。