为什么使用指针的 STL 算法比 std::vector 迭代器快得多?

Why are STL algorithms much faster with pointers than std::vector iterators?

为什么 std::nth_element() 运行 使用指针而不是迭代器会快很多?我希望 std::vector 和 STL 算法得到相当优化,但我的测量显示,当我将迭代器更改为指针时,执行时间下降了 75%。

使用迭代器,以下代码(不包括向量的分配)运行 在 1200 毫秒内:

std::vector<uint16_t> data(/* 50 million values */);

const double alfa = 0.01;
const double beta = 0.95;

std::nth_element(data.begin(), data.begin() + int(data.size() * alfa), data.end());
const uint16_t x = *(data.begin() + int(data.size() * alfa));

std::nth_element(data.begin(), data.begin() + int(data.size() * beta), data.end());
const uint16_t y = *(data.begin() + int(data.size() * beta));

使用指针,以下代码(不包括向量的分配)运行在 350 毫秒内:

std::vector<uint16_t> data(/* 50 million values */);

const double alfa = 0.01;
const double beta = 0.95;

std::nth_element(&data.front(), &data.front() + int(data.size() * alfa),
    &data.front() + data.size());
const uint16_t x = *(data.begin() + int(data.size() * alfa));

std::nth_element(&data.front(), &data.front() + int(data.size() * beta),
    &data.front() + data.size());
const uint16_t y = *(data.begin() + int(data.size() * beta));

我也观察到 std::sort() 也有类似的速度提升。这些示例是使用 Embarcadero C++ Builder XE8 版本 22.0.19027.8951、发布版本和 "Generate fastest possible code" 设置编译的。这些测试 运行 在不同的执行过程中进行,因此它们不应相互影响。

我的猜测是编译器要么在优化方面做得不好,要么您在调试模式下构建并且编译器使用特殊的调试(慢)版本的 STL 容器。