You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Vector与动态数组基准测试:性能瓶颈究竟何在?

为什么std::vector初始化比动态数组new[]/delete[]慢?

先看你的基准测试结果:

---------------------------------------------------------------------------
Benchmark               Time             CPU   Iterations
---------------------------------------------------------------------------
BM_VectorInit         1335 ns         1193 ns     497778
BM_RawInit              58 ns           55 ns    10000000

对应的测试代码:

static void BM_VectorInit(benchmark::State &state) {
    for (auto _ : state) {
        std::vector<char> a(MAX_PACKET_LENGTH);
    }
}

static void BM_RawInit(benchmark::State &state) {
    for (auto _ : state) {
        auto a = new char[MAX_PACKET_LENGTH];
        delete[] a;
    }
}

其中MAX_PACKET_LENGTH = 32768。

两者性能差距的核心原因在于元素初始化的差异:

  • new char[MAX_PACKET_LENGTH] 执行的是默认初始化:对于char这种POD(Plain Old Data)类型,默认初始化不会对内存做任何写入操作——它只是从堆上分配一块32KB的内存,直接返回指针,没有额外的写入开销。
  • std::vector<char>(MAX_PACKET_LENGTH) 执行的是值初始化:vector的这个构造函数会为每个元素赋予默认值(对于char就是\0)。这意味着它要遍历32768个char,把每个字节都设置为0,这是一笔不小的内存写入开销——32KB的内存写入操作,正是你看到时间差的主要来源。

除此之外,还有一些次要的开销因素,但相比初始化写入可以忽略:

  • vector的构造函数会额外维护内部的三个指针(begin、end、capacity),而动态数组只是一个单纯的指针,不过这几个指针的赋值操作耗时微乎其微。
  • 默认std::allocator的内存分配逻辑和new基本一致,不会带来显著的性能差异。

如果想让vector的初始化性能接近动态数组,你可以避免元素初始化——比如先reserve足够的空间,再直接使用未初始化的内存(不过这种做法要小心,因为元素处于未定义状态):

static void BM_VectorReserve(benchmark::State &state) {
    for (auto _ : state) {
        std::vector<char> a;
        a.reserve(MAX_PACKET_LENGTH);
        // 此时vector的容量足够,但元素未初始化,使用时要注意
    }
}

不过通常来说,vector自动初始化元素的特性是一个安全保障——它避免了使用未初始化内存导致的未定义行为,这也是为什么我们推荐优先使用STL容器而非裸动态数组的原因:安全性的收益远大于这种场景下的性能损失。

内容的提问来源于stack exchange,提问作者Damian Kalinowski

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 10:05:41