Вы сравниваете стоимость построения std::vector
со стоимостью размещения массива в куче. Когда вы создаете std::vector
, он внутренне выделяет массив в куче, но есть дополнительные издержки, поскольку std::vector
сам по себе является объектом, который должен быть создан и сохранен (возможно, в стеке или в куче). Следовательно, создание std::vector
должно занять больше времени, чем создание new char[]
.
Как говорится, есть еще одна разница между BM_RawInit
и BM_VectorInit
. Когда вы создаете std::vector
с одним целочисленным аргументом, как в std::vector<char> a(MAX_PACKET_LENGTH)
, происходят две вещи. В куче будет выделено место для MAX_PACKET_LENGTH
предметов и , эти предметы также будут созданы по умолчанию. С другой стороны, когда вы делаете new char[MAX_PACKET_LENGTH]
, происходит только распределение.
Для лучшего сравнения попробуйте создать третий бенчмарк, который выделяет только пространство, например:
static void BM_VectorReserve(benchmark::State &state)
{
for (auto _ : state)
{
std::vector<char> a;
a.reserve(MAX_PACKET_LENGTH);
}
}
Это не идеальное сравнение, потому что небольшой объем памяти будет выделен в первой строке, где мы объявляем a
, а затем, когда мы вызываем reserve
, эта начальная память будет освобождена. После этого std::vector
выделит достаточно места для MAX_PACKET_LENGTH
элементов. В реальном коде это часто незначительно, но ради вашего теста это частично объясняет, почему BM_VectorReserve
занимает больше времени, чем BM_RawInit
.