【问题标题】:Add Arrays without a loop C++添加没有循环的数组 C++
【发布时间】:2018-06-03 23:19:24
【问题描述】:

我们如何在不使用 C++ 编写显式循环的情况下添加两个相同大小的数组 例如:

int a[3]={1,2,3};
int b[3]={4,3,2};
int c[3]; //to contain sum of a and b

【问题讨论】:

  • 你对循环有什么看法?
  • 我在我的项目中要多次使用加法,所以我希望有一些优化的方法。
  • 使用例如std::valarray。这大致就是它的
  • std::valarray 是我要找的。​​span>

标签: c++ arrays loops


【解决方案1】:

如果无法使用显式循环,则使用可能的隐式循环。让标准库为您完成。

std::transform(a, a + 3, b, c, std::plus<int>{});

如果您发现自己经常在相同大小的数组上执行此操作,您甚至可以将其模板化:

template<typename T, std::size_t N>
void add_arrays( T (const &a)[N], T (const &b)[N], T (&c)[N] ) {
  std::transform(a, a + N, b, c, std::plus<T>{});
}

编译器会很好并为您检查大小。你甚至不必停在那里。有很多方法可以让 add_arrays 在更多情况下使用。


说了这么多。尝试放弃使用原始数组。使用std::array 作为默认值。它是对原始数组的薄包装,但它具有值语义。如果您出于某种目的需要固定的事物集合(例如,您正在做图形编程,所以您存储坐标),请尝试使用指定类型来代替它。

【讨论】:

  • 我们又来了。
【解决方案2】:

如果你真的想要无循环性能,你可以试试:

#include <emmintrin.h>
#include <iostream>

alignas(16) int32_t a[4] = {1, 2, 3, 0};
alignas(16) int32_t b[4] = {4, 3, 2, 0};
alignas(16) int32_t c[4];

main()
{
  __m128i simd_a = _mm_load_si128((__m128i*)a);
  __m128i simd_b = _mm_load_si128((__m128i*)b);


  // No loop for addition and performance is here.
  //
  __m128i simd_c = _mm_add_epi32(simd_a, simd_b);

  _mm_store_si128((__m128i*)c, simd_c);

  std::cout << "\n" << c[0] << " " << c[1] << " " << c[2] << " " << c[3];
}

更严重的是,如果您的向量很小并且性能是一个真正的问题,您可以使用 SIMD。不要自己重新编码 simd,而是使用可用的优秀库之一。

此类 C++ 库的示例:

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-10-07
    • 1970-01-01
    • 2016-10-12
    • 2020-06-16
    • 1970-01-01
    • 2023-03-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多