Каковы точные требования к продолжительности автоматического хранения?

В зависимости от компилятора следующий код:

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

при запуске в системе с максимальным размером стека, равным 1 мегабайту, либо печатает пустую строку, либо вылетает из-за переполнения стека.

Разница в том, что разные компиляторы по-разному выделяют автоматическое хранилище. Большинство компиляторов выделяют память для всех объектов при запуске функции , поэтому в приведенном выше коде они выделяют 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 сосуществуют? Законно ли выделять больше памяти, чем требуется программе в худшем случае (первая стратегия)?

12
задан Community 23 May 2017 в 11:51
поделиться