Рассмотрим следующий простой код, который использует new
(я знаю, что delete[]
, но он не относится к этому вопросу):
int main()
{
int* mem = new int[100];
return 0;
}
Разрешено ли компилятору оптимизировать new
вызов?
В моем исследовании g++ (5.2.0) и Visual Studio 2015 не оптимизируют new
вызов, в то время как clang (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;
}