Обычно при любом выделении памяти накладные расходы. Теперь это из моих знаний о malloc
, а не new
, но я подозреваю, что это то же самое.
Часть области памяти, выделенная для (скажем) 30 байтов, обычно будет иметь заголовок (например, 16 байтов, и все подобные цифры приведены только в качестве примеров ниже, они могут отличаться) и может быть дополнен до 16 байтов для более легкого управления ареной.
Заголовок, как правило, важен для того, чтобы раздел можно было реинтегрировать в пул свободной памяти, когда вы закончите с ним.
Содержит информацию о размере блока как минимум и может также иметь защитные устройства памяти (для обнаружения повреждения арены).
Итак, когда вы выделите свой массив структуры миллион, вы обнаружите, что он использует дополнительные 16 байтов для заголовка (четыре миллиона и шестнадцать байтов). Когда вы попытаетесь выделить один миллион отдельных структур, каждая из них будет иметь эти издержки.
Я ответил на связанный вопрос здесь с более подробной информацией. Я подозреваю, что для C ++ потребуется больше требуемой информации заголовка, так как, вероятно, придется хранить количество элементов сверх размера раздела (для правильных вызовов деструктора), но это только предположение с моей стороны. Это не влияет на тот факт, что какая-то учетная информация необходима для каждой выделенной позиции.
Если вы действительно хотите увидеть, для чего используется пространство, вам нужно покопаться в исходном коде среды выполнения MSVC.