自动存储持续时间的确切要求是什么?

时间:2011-08-18 06:13:20

标签: c++ memory memory-management duration

根据编译器的不同代码:

int main()
{
   srand( 0 );
   if( rand() ) {
      char buffer[600 * 1024] = {};
      printf( buffer );
   } else {
      char buffer[500 * 1024] = {};
      printf( buffer );
   }
   return 0;
}

在最大堆栈大小等于1兆字节的系统上运行时,要么打印一个空字符串,要么在堆栈溢出时崩溃。

不同之处在于不同的编译器以不同方式分配自动存储。大多数编译器分配存储for all objects on function start,因此在上面的代码中,它们分配600 + 400 = 1100千字节,这导致堆栈溢出。有些编译器更聪明,他们发现这两个数组永远不能同时访问,所以他们重用相同的内存,只分配600千字节,程序运行正常。

现在标准说(3.7 / 1)存储持续时间定义了存储的最小潜在生命周期,然后(3.7.2 / 1)这些对象的存储空间[与自动持续时间]持续到创建它们的块

我不明白3.7 / 1和3.7.2 / 1是如何一起应用的。一个说持续时间是最小潜力而另一个明确表示它持续到块存在。看起来根据第一个分配策略是合法的,但第二个要求只使用“重用”分配策略。

3.7 / 1和3.7.2 / 1如何共存?在最坏的情况下(第一个策略)分配比程序需要更多的内存是否合法?

2 个答案:

答案 0 :(得分:7)

我阅读3.7 /作为不同存储classe(自动,静态,动态)的介绍性描述和定义,而不是每个的实现要求......然后在3.7.2 / 1中描述了automatich的实现要求

阅读3.7.2 / 1它并不禁止它存在的时间比块存在的时间长(这只是最小值) - 恕我直言,这是编译器实现者关于可能的优化的开放......

答案 1 :(得分:6)

“持续到”也是最低限度。