c++ - std::vector 和动态分配数组有什么区别?

我写了两个函数来比较 std::vector 和动态分配数组的时间成本

#include <iostream>
#include <vector>
#include <chrono>

void A() {
  auto t1 = std::chrono::high_resolution_clock::now();
  std::vector<float> data(5000000);
  auto t2 = std::chrono::high_resolution_clock::now();

  float *p = data.data();
  for (int i = 0; i < 5000000; ++i) {
    p[i] = 0.0f;
  }
  auto t3 = std::chrono::high_resolution_clock::now();
  std::cout << std::chrono::duration_cast<std::chrono::microseconds>(t2 - t1).count() << " us\n";
  std::cout << std::chrono::duration_cast<std::chrono::microseconds>(t3 - t2).count() << " us\n";
}

void B() {
  auto t1 = std::chrono::high_resolution_clock::now();
  auto* data = new float [5000000];
  auto t2 = std::chrono::high_resolution_clock::now();
  float *ptr = data;
  for (int i = 0; i < 5000000; ++i) {
    ptr[i] = 0.0f;
  }
  auto t3 = std::chrono::high_resolution_clock::now();
  std::cout << std::chrono::duration_cast<std::chrono::microseconds>(t2 - t1).count() << " us\n";
  std::cout << std::chrono::duration_cast<std::chrono::microseconds>(t3 - t2).count() << " us\n";
}

int main(int argc, char** argv) {
  A();
  B();
  return 0;
}

A() 花费了大约 6000 us 来初始化 vector ,然后 1400 us 来填充零。

B() 花费不到 10 us 来分配内存,然后 5800 us 来填充零。

为什么他们的时间成本相差这么大?

编译器:g++=9.3.0

标志:-O3 -DNDEBUG

最佳答案

首先,请注意 std::vector<float>构造函数已经将 vector 归零。

对于您观察到的行为,有许多似是而非的系统级解释:

一个非常合理的是缓存:当你使用new分配数组时,返回指针引用的内存不在缓存中。创建 vector 时,构造函数会将分配的内存区域归零,从而将内存放入缓存。因此,后续清零将命中缓存。

其他原因可能包括编译器优化。编译器可能会意识到您的归零对于 std::vector 是不必要的。不过,鉴于您获得的数字,我会在这里打折扣。

https://stackoverflow.com/questions/71292753/

相关文章:

r - 检查列表中的值是否存在于多列 R data.table 中

r - 如何获取下划线分隔的元素个数

bash - 从多个文件中获取字符串并复制到新文件并将文件名打印到 bash 的第二列

android - 如何在撰写的TextField中用逗号格式化数字

powershell - 仅添加真实 MAC 地址

reactjs - react 路线不工作 | react 路由器

c++ - 将字符数组 char u[10] 与字符串文字 "abc"进行比较是否是未定义的行为

swift - RealityKit——在检测到的平面上可视化网格

google-cloud-platform - (Terraform) 左操作数 : a numbe

flutter - 图标聚集在带有 float 按钮的 flutter 底部导航栏中