【发布时间】:2012-03-26 15:14:46
【问题描述】:
继续绕圈子,但我仍然不清楚这一点。对答案有感觉;但不确定。下面哪个代码消耗更多内存? [如果我是正确的,应该是前者。]
double x;
double* y = new double(x);
或
double x;
double* y = &x;
【问题讨论】:
标签: c++ pointers memory-management
继续绕圈子,但我仍然不清楚这一点。对答案有感觉;但不确定。下面哪个代码消耗更多内存? [如果我是正确的,应该是前者。]
double x;
double* y = new double(x);
或
double x;
double* y = &x;
【问题讨论】:
标签: c++ pointers memory-management
在前者中,存在两个double(x,和y指向的一个)。 x 分配在栈上,y 分配在堆上。
在后者中,只有一个double 存在(x,也被y 指向)。这里不涉及堆分配。
所以,从表面上看,你是对的。
在这两种情况下,堆栈上都有一个double,堆栈上还有一个double*。两者的区别在于,在第一种情况下,还有在堆上分配了一个double(new double(x) 分配的那个)。因此第一种情况需要更多的存储空间。
【讨论】:
以下内容在堆上消耗sizeof( double ) + sizeof( double* ) 加上sizeof( double ):
double x;
double* y = new double(x);
以下消耗sizeof( double ) + sizeof( double* ):
double x;
double* y = &x;
【讨论】:
第一个。有两个double和一个指针(通常是long int)
在第二个中你只有一个双精度和一个指针
【讨论】:
在这个例子中:
double x;
double* y = new double(x);
您拥有用于x、指针y 的内存空间,以及存储x 副本并由y 指向的新分配内存。
在这个例子中:
double x;
double* y = &x;
您拥有x 的内存空间,用于指向x 的指针y。这会占用更少的空间。
【讨论】:
double x;
double* y = &x;
将采取sizeof(double) + sizeof(void*)
double x;
double* y = new double(x);
将采用sizeof(double) + sizeof(double) + sizeof(void*)。还通过new 从堆中分配内存。基于堆分配器也会有更多的记账开销(特别是如果它分解了一个连续的空闲块),并且会更慢。
【讨论】:
首先在第一行为 1 个 double 分配空间,然后在第二行为 1 个指针和另一个 double 分配空间,并从旧指针复制值。 后者为 1 double 和指针分配空间。 所以首先是更多的内存消耗。
【讨论】: