В MSVC malloc определяется так (пропуская несущественную часть):
__declspec(restrict) void * __cdecl malloc(_In_ size_t _Size);
Однако operator new определён без
__declspec(restrict).
Из-за этого компилятор может произвести оптимизацию в случае использования malloc, но не может с new.
Можно проверить через флаг
/Qvec-report:2
Кто знает, почему стандарт не требует возвращать указатель на не перекрывающиеся данные в 'new' в отличии от malloc ?
P.S.
Если вручную определить в своём проекте new, то можем получить существенное ускорение:
__declspec(restrict) void* operator new(size_t n)
{
return malloc(n);
}