Я спрашиваю, почему. Clackmark: < /p>
Код: Выделить всё
#include
#include
using namespace std;
alignas(4096) unsigned char v[1024 * 1024];
void bm_memmove(benchmark::State& state) {
const auto size = static_cast(state.range(0));
const auto n = static_cast(state.range(1));
const size_t n1 = n < 0 ? 0 : n;
const size_t n0 = n < 0 ? -n : 0;
benchmark::DoNotOptimize(v);
for (auto _ : state) {
memmove(v + n0, v + n1, size);
benchmark::DoNotOptimize(v);
}
}
BENCHMARK(bm_memmove)->ArgsProduct({{8191, 8193}, {-5, +5}});
BENCHMARK_MAIN();
< /code>
Вывод для меня на 12-м поколении Intel (R) Core (TM) I5-1235U и последнее MSVC выглядит следующим образом: < /p>
Подробнее здесь: [url]https://stackoverflow.com/questions/79619377/why-is-rep-movsb-slow-for-overlapping-forward-memmove-and-why-does-libc-use-it[/url]
Мобильная версия