Есть два вектора в1 и в2, задача получить третий вектор в3, каждый элемент которого равен логическому ИЛИ соответствующих элементов векторов в1 и в2. Размерности в1 и в2 равны.
Решение в лоб:
int main()
{
std::vector<long> v1(128, 1L);
std::vector<long> v2(128, 2L);
std::vector<long> v3(128, 0L);
for (size_t i = 0; i < 128; ++i)
{
v3[i] = v1[i] | v2[i];
}
for (size_t i = 0; i < 128; ++i)
{
std::cout << v3[i];
}
std::cout << std::endl;
system("pause");
}
Есть ли способ быстрее поочередного обхода каждого элемента?
Хватит думать за компилятор, он тоже умный.
Напишем код и посмотрим на ассемблерный выхлоп:
using vec_t = std::vector<unsigned long>;
void vec_or(const vec_t& a, const vec_t& b, vec_t& c) {
for (size_t i = 0; i < a.size(); i++) {
c[i] = a[i] | b[i];
}
}
Результат компиляции (опции: -O3 -mavx): https://godbolt.org/z/v8lmGv
Насколько мне известно, команда vorps оперирует 128-битными числами. Это означает, что за одну операцию цикла честно обрабатывается 128 бит - это 32х uint32_t или 16x uint64_t! Разве этого мало?
Я немного схитрил и включил AVX-инструкции, но даже без опции -mavx (или аналогичной для других компиляторов), получается высокооптимизированный код.
std::valarray как раз делает то, что вам нужно: выполняет действие сразу со всеми элементами(это класс, наиболее оптимизированный для численных расчетов). Только у него аргументы конструктора в обратном порядке:
std::valarray<long> v1(1L, 128);
std::valarray<long> v2(2L, 128),
v3 = v1 | v2;
И все...
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости