根据编译器的不同,以下代码:
int main()
{
srand( 0 );
if( rand() ) {
char buffer[600 * 1024] = {};
printf( buffer );
} else {
char buffer[500 * 1024] = {};
printf( buffer );
}
return 0;
}
当在最大堆栈大小等于 1 MB 的系统上运行时,要么打印空字符串,要么因堆栈溢出而崩溃。
差异是因为不同的编译器分配自动存储的方式不同。大多数编译器分配存储对于函数启动时的所有对象,所以在上面的代码中他们分配了 600+400=1100 KB,这导致了堆栈溢出。一些编译器更聪明,他们发现这两个数组永远无法同时访问,因此他们重用相同的内存,只分配 600 KB,程序运行良好。
现在标准说(3.7/1)存储持续时间定义存储的最短潜在寿命然后(3.7.2/1)这些对象的存储[具有自动持续时间]将持续到创建它们的块存在为止.
我不明白 3.7/1 和 3.7.2/1 如何一起应用。有人说持续时间是最小潜力另一个明确表示它持续到该块存在为止。根据第一个,看起来两种分配策略都是合法的,但第二个要求仅使用“重用”分配策略。
3.7/1 和 3.7.2/1 如何共存?在最坏的情况下(第一种策略)分配比程序需要更多的内存是否合法?
我将 3.7/ 作为不同存储类(自动、静态、动态)的介绍性描述和定义来阅读,而不是作为每个存储类的实现要求......然后在 3.7.2/1 中描述了automatich 的实现要求。
阅读 3.7.2/1 它并不禁止它存在的时间比块存在的时间长(这只是最小值) - 恕我直言,这是编译器实现者关于可能的优化的一个机会......
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)