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

vll*_*vll 3 c++ pointers vector c++builder

为什么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));
Run Code Online (Sandbox Code Playgroud)

使用指针,以下代码(不包括向量的分配)在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));
Run Code Online (Sandbox Code Playgroud)

我也观察到类似的速度增加std::sort().这些示例使用Embarcadero C++ Builder XE8版本22.0.19027.8951,发布版本和"生成最快可能的代码"设置进行编译.这些测试是在不同的执行期间运行的,因此它们不应相互影响.

Gal*_*lik 6

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