Во-первых, когда вы компилируете с включенными оптимизациями розничной торговли, вы получите совершенно разные результаты. (Мой быстрый порт в Windows и некоторые исправления в вашем коде, включая не измерение времени до окончания инструкции cout):
C - Malloc/Free:
Elapsed time: 469 msec (21321 allocations/second)
C++98 - New/Delete:
Elapsed time: 500 msec (20000 allocations/second)
C++11 - auto_ptr:
Elapsed time: 484 msec (20661 allocations/second)
C++11 - shared_ptr:
Elapsed time: 1157 msec (8643 allocations/second)
C++11 - unique_ptr:
Elapsed time: 484 msec (20661 allocations/second)
Все, кроме shared_ptr, имеют одинаковую скорость. shared_ptr
должен выделить некоторые блокирующие конструкции (мьютекс), так как он является поточно-ориентированным в отношении назначений ссылок и слабых_птров.
Во-вторых, ваша методология имеет недостатки, за каждым выделением следует освобождение, за которым следует распределение идентичного размера. Возможно, компилятор может просто оптимизировать все это, так как указатель выделения ни для чего не используется.
И вполне вероятно, что менеджер памяти верхнего уровня может быстро вернуть указатель из кучи, так как он только что передал указатель идентичного размера. Никогда не нужно возвращаться к нижней куче, чтобы увеличить кучу.