Законно ли оптимизировать распределение памяти?

Дана программа:

#include <cstdlib>
#include <memory>

bool test() {
  int* ptr = (int *)malloc(sizeof(int));
  bool result = ptr != nullptr;
  free(ptr);
  return result;
}

bool test2() noexcept {
  int * ptr;
  try {
    ptr = new int;
  }
  catch (const std::bad_alloc&) {
    return false; 
  }
  bool result = ptr != nullptr;
  delete ptr;
  return result;
}

int main()
{
  return test();
}

Clang оптимизирует обе функции до простого

{
  return true;
}

См. на godbolt. GCC 6.1 этого не делает. Clang делает это даже с -O1 уровнем оптимизации.

Законно ли это с точки зрения стандарта С++?


person vladon    schedule 17.07.2016    source источник
comment
Выглядит действительным для меня в соответствии с правилом «как если бы». Я не понимаю, как соответствующая программа может определить, имела ли место эта оптимизация.   -  person Igor Tandetnik    schedule 17.07.2016
comment
@IgorTandetnik Вопрос не о том, как его обнаружить. Вопрос в том, соответствует ли стандарту такая оптимизация?   -  person vladon    schedule 17.07.2016
comment
Но суть правила «как если» заключается в обнаружении: [intro.execution]/1 Семантические описания в этом международном стандарте определяют параметризованную недетерминированную абстрактную машину. Настоящий международный стандарт не предъявляет требований к структуре соответствующих реализаций. В частности, им не нужно копировать или эмулировать структуру абстрактной машины. Скорее, соответствующие реализации необходимы для эмуляции (только) наблюдаемого поведения абстрактной машины, как объяснено ниже. 5)   -  person Igor Tandetnik    schedule 17.07.2016
comment
Сноска 5: Это положение иногда называют правилом «как если бы», потому что реализация может игнорировать любое требование настоящего Международного стандарта, пока результат как если бы требование было соблюдено, насколько это можно определить по наблюдаемому поведению программы. Например, реальной реализации не нужно оценивать часть выражения, если можно сделать вывод, что его значение не используется и что нет побочных эффектов, влияющих на наблюдаемое поведение программы. Акцент мой.   -  person Igor Tandetnik    schedule 17.07.2016
comment
@IgorTandetnik может обнаружить это, если вы замените глобальный оператор новым. Но я думаю, что это не так в предоставленном коде. OP должен заменить его функцией с побочными эффектами и снова проверить оптимизацию.   -  person Revolver_Ocelot    schedule 17.07.2016