继续绕圈子,但我仍然不清楚这一点。对答案有感觉;但不确定。下面哪个代码消耗更多内存? [应该是前者,如果我是对的。]
double x;
double* y = new double(x);
OR
double x;
double* y = &x;
答案 0 :(得分:7)
在前者中,存在两个double
(x
,以及y
指向的x
。 y
在堆栈上分配,double
在堆上。
在后者中,只有一个x
存在(y
,double
也指向)。这里没有涉及堆分配。
所以,从表面上看,你是对的。
在两种情况下,堆栈上都有一个double*
,堆栈上也有一个double
。两者之间的区别在于,在第一种情况下,在堆上分配了也一个new double(x)
(由{{1}}分配的那个)。因此,第一种情况需要更多存储空间。
答案 1 :(得分:7)
以下内容在堆上消耗sizeof( double ) + sizeof( double* )
加sizeof( double )
:
double x;
double* y = new double(x);
以下消耗sizeof( double ) + sizeof( double* )
:
double x;
double* y = &x;
答案 2 :(得分:1)
double x;
double* y = &x;
将采用sizeof(double) + sizeof(void*)
double x;
double* y = new double(x);
将sizeof(double) + sizeof(double) + sizeof(void*)
。还通过new
从堆中分配内存。基于堆分配器还会有更多的簿记开销(特别是如果它分解了一个连续的空闲块),它会更慢。
答案 3 :(得分:1)
第一个。有两个双打和一个指针(通常是长整数)
在第二个中你只有一个双指针和一个指针
答案 4 :(得分:1)
在这个例子中:
double x;
double* y = new double(x);
您有x
的内存空间,指针y
,以及存储x
副本的新分配内存,由y
指向。
在这个例子中:
double x;
double* y = &x;
你有x
的内存空间,指针y
指向x
。这占用的空间更少。
答案 5 :(得分:0)
首先在第一行为1 double分配空间,然后在第二行为1指针和另一个double分配空间,并从旧的复制值。 后者为1倍和指针分配空间。 所以首先是更多的内存消耗。