bool example1()
{
long a;
a = 0;
cout << a;
a = 1;
cout << a;
a = 2;
cout << a;
//and again...again until
a = 1000000;
cout << a+1;
return true;
}
bool example2()
{
long* a = new long;//sorry for the misstake
*a = 0;
cout << *a;
*a = 1;
cout << *a;
*a = 2;
cout << *a;
//and again...again until
*a = 1000000;
cout << *a + 1;
return true;
}
请注意,我不会删除example2()中的 a ,只是新手的问题:
1.当两个功能执行时,哪一个使用更多的记忆?
2.功能返回后,哪一个使整个程序使用更多的记忆?
谢谢你的帮助!
更新:只需回复长* a; long * a = new long;
更新2:为了避免我们没有对 a 做任何事情,我每次都会输入值。
答案 0 :(得分:2)
这取决于同时没有区别。
第一个程序将在堆栈上消耗sizeof(long)
个字节,第二个程序将消耗sizeof(long*)
。通常long*
至少与long
一样大,所以你可以说第二个程序可能会使用更多内存(取决于编译器和架构)。
另一方面,堆栈存储器分配有OS存储器页面粒度(4KB是一个很好的估计),因此两个程序几乎保证使用相同数量的存储器页面用于堆栈。从这个意义上讲,从观察系统的人的角度来看,内存使用情况将是相同的。
但它变得更好:编译器可以自由决定(实际上是根据设置)你没有对这些局部变量做任何事情,所以它可能决定在这两种情况下根本就不分配任何内存。
最后你必须回答“指针指向什么”的问题(正如其他人所说,程序当前编写的方式,它几乎肯定会因运行时访问无效内存而崩溃)。
假设它没有(假设指针被初始化为有效的内存地址),你会将该内存计为“已使用”吗?
long* a = new long
编辑):现在我们知道指针有效,堆内存将分配给long
(但未发布!)。堆栈分配与以前相同,但现在example2
也将在堆上使用至少sizeof(long)
个字节(很可能它会使用更多,但你不知道多少因为这取决于正在使用的堆分配器,而后者依赖于编译器设置等。)
现在从观察系统的人的角度来看,两个程序仍然不太可能展示不同的内存占用(因为堆分配器很可能满足new long
中example2
的请求从已经从OS接收到的页面中的内存,但是在进程的地址空间中肯定会有更少的可用内存。所以在这个意义上,example2
会使用更多的内存。还有多少?取决于分配的开销,如前所述,这是未知的。
最后,由于example2
在退出之前没有释放堆内存(即存在内存泄漏),因此即使它返回后它也将继续使用堆内存,而example1
则不会。
答案 1 :(得分:1)
只有一种方法可以通过测量来了解。由于您实际上从未使用过您指定的任何值,因此编译器可以在“as-if规则”下简单地将两个函数优化为:
bool example1()
{
return true;
}
bool example2()
{
return true;
}
根据C ++规则,这将是对代码的完全有效解释。由您来编译和测量它以查看实际发生的情况。
叹息,对问题的编辑对上述情况有所不同。主要观点仍然存在:除非你测量它,否则你无法知道。现在,这两个功能都可以优化为:
bool example1()
{
cout << 0;
cout << 1;
cout << 2;
//and again...again until
cout << 1000001;
return true;
}
bool example2()
{
cout << 0;
cout << 1;
cout << 2;
//and again...again until
cout << 1000001;
return true;
}
答案 2 :(得分:0)
example2()
永远不会为指针a
引用的值分配内存。如果确实如此,则会占用更多的内存,因为它需要long
所需的空间以及指向它的指针的空间。
此外,无论您为a
分配多少次,都不会使用更多内存。
答案 3 :(得分:0)
示例2存在不为指针分配内存的问题。指针a最初具有未知值,使其指向内存中的某处。为此指针指定值会破坏某处的内容。
两个示例都使用相同数量的内存。 (这是4个字节。)