Разрешено ли компилятору оптимизировать распределение памяти в куче?

Рассмотрим следующий простой код, который используетnew (Я знаю, что нетdelete[], но это не относится к этому вопросу)

int main()
{
    int* mem = new int[100];

    return 0;
}

Разрешено ли компилятору оптимизироватьnew вызов?

В моем исследованииg ++ (5.2.0) и Visual Studio 2015 не оптимизируютnew вызов,в то время как лязг (3.0+) делает, Все тесты были выполнены с включенной полной оптимизацией (-O3 для g ++ и clang, режим выпуска для Visual Studio).

неnew сделать системный вызов под капотом, сделав невозможным (и незаконным) для компилятора оптимизировать это?

РЕДАКТИРОВАТЬТеперь я исключил неопределенное поведение из программы:

#include <new>  

int main()
{
    int* mem = new (std::nothrow) int[100];
    return 0;
}

Clang 3.0 не оптимизирует это больше, ноболее поздние версии делают.

EDIT2:

#include <new>  

int main()
{
    int* mem = new (std::nothrow) int[1000];

    if (mem != 0)
      return 1;

    return 0;
}

Clang всегда возвращает 1.

Ответы на вопрос(5)

Ваш ответ на вопрос