为什么C ++程序会为局部变量分配更多的内存,而不是在最坏的情况下需要? [英] Why would a C++ program allocate more memory for local variables than it would need in the worst case?
本文介绍了为什么C ++程序会为局部变量分配更多的内存,而不是在最坏的情况下需要?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
受此问题的启发。
显然,下面的代码:
#include< Windows.h>
int _tmain(int argc,_TCHAR * argv [])
{
if(GetTickCount()> 1){
char buffer [500 * 1024] ;
SecureZeroMemory(buffer,sizeof(buffer));
} else {
char buffer [700 * 1024];
SecureZeroMemory(buffer,sizeof(buffer));
}
return 0;
}
使用默认堆栈大小(1兆字节) (/ O2)发生堆栈溢出,因为程序试图在堆栈上分配1200千字节。
上面的代码当然稍微夸张了,堆栈在一个相当蠢的方式。然而在实际情况下,堆栈大小可以更小(如256千字节),并且可能有更多的分支与更小的对象,这将导致足够的分配大小溢出堆栈。
这没有意义。最坏的情况是700千字节 - 这将是构建一组具有最大总大小的局部变量的代码路径。在编译期间检测该路径应该不是问题。
因此,编译器生成一个程序,试图分配比最坏的情况更多的内存。根据此答案 LLVM也是这样。
这可能是编译器的一个缺陷,或者可能有一些真正的原因。我的意思是说,我只是不明白编译器设计中的东西,这将解释为什么这样的分配是必要的。