Разрешено ли компилятору оптимизировать распределение памяти в куче?
Рассмотрим следующий простой код, который использует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;
}