【问题标题】:C++ pointers memory usageC++ 指针内存使用情况
【发布时间】:2012-03-26 15:14:46
【问题描述】:

继续绕圈子,但我仍然不清楚这一点。对答案有感觉;但不确定。下面哪个代码消耗更多内存? [如果我是正确的,应该是前者。]

double x;
double* y = new double(x);

double x;
double* y = &x;

【问题讨论】:

    标签: c++ pointers memory-management


    【解决方案1】:

    在前者中,存在两个doublex,和y指向的一个)。 x 分配在栈上,y 分配在堆上。

    在后者中,只有一个double 存在(x,也被y 指向)。这里不涉及堆分配。

    所以,从表面上看,你是对的。

    在这两种情况下,堆栈上都有一个double,堆栈上还有一个double*。两者的区别在于,在第一种情况下,还有在堆上分配了一个doublenew double(x) 分配的那个)。因此第一种情况需要更多的存储空间。

    【讨论】:

    • 你确定吗?如果我们必须考虑这样的代码总体消耗的 RAM 内存(想想数百万这样的双精度数)......我需要确定前者是否正确。我知道指针本身消耗固定的 8 个字节(例如,在 64 位系统上);所以当你这样看时,第一个代码似乎使用 2 x 8 (或者它是 3 x 8,因为第二行赋值右侧的新字符?)字节,而第二个也使用2 x 8 字节。哪个是正确的?
    • 您在评论结束时说“第二种情况需要更多存储空间”。那是错字吗?您的意思是“第一种情况..”吗?
    • 谢谢,我脑子里有了固定的想法。干杯。
    【解决方案2】:

    以下内容在堆上消耗sizeof( double ) + sizeof( double* ) 加上sizeof( double )

    double x;
    double* y = new double(x);
    

    以下消耗sizeof( double ) + sizeof( double* )

    double x;
    double* y = &x;
    

    【讨论】:

      【解决方案3】:

      第一个。有两个double和一个指针(通常是long int)

      在第二个中你只有一个双精度和一个指针

      【讨论】:

        【解决方案4】:

        在这个例子中:

        double x;
        double* y = new double(x);
        

        您拥有用于x、指针y 的内存空间,以及存储x 副本并由y 指向的新分配内存。

        在这个例子中:

        double x;
        double* y = &x;
        

        您拥有x 的内存空间,用于指向x 的指针y。这会占用更少的空间。

        【讨论】:

          【解决方案5】:
          double x;
          double* y = &x;
          

          将采取sizeof(double) + sizeof(void*)

          double x;
          double* y = new double(x);
          

          将采用sizeof(double) + sizeof(double) + sizeof(void*)。还通过new 从堆中分配内存。基于堆分配器也会有更多的记账开销(特别是如果它分解了一个连续的空闲块),并且会更慢。

          【讨论】:

            【解决方案6】:

            首先在第一行为 1 个 double 分配空间,然后在第二行为 1 个指针和另一个 double 分配空间,并从旧指针复制值。 后者为 1 double 和指针分配空间。 所以首先是更多的内存消耗。

            【讨论】:

              猜你喜欢
              • 2023-03-04
              • 2010-10-19
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2014-01-19
              • 2012-03-27
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多