对自动保存期限的确切要求是什么?

What are exact requirements on automatic storage duration?

本文关键字:是什么 保存期限      更新时间:2023-10-16

根据编译器的不同,有以下代码:

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

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

不同是因为不同的编译器分配不同的自动存储空间。大多数编译器在函数启动时为所有对象分配存储空间,因此在上面的代码中,它们分配600+400= 1100kb,这会导致堆栈溢出。有些编译器更聪明,它们知道这两个数组永远不能同时访问,所以它们重用相同的内存,只分配600千字节,程序运行良好。

现在标准说(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中描述。

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

" lastuntil "也是最小值