std::array 与数组性能

新手上路,请多包涵

如果我想构建一个非常简单的数组,例如:

 int myArray[3] = {1,2,3};

我应该使用 std::array 代替吗?

 std::array<int, 3> a = {{1, 2, 3}};

使用 std::array 相比普通有什么优势?它的性能更高吗?只是更容易处理复制/访问?

原文由 Arcyno 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.3k
2 个回答

使用 std::array 与通常的相比有什么优势?

它具有友好的值语义,因此可以按值传递给函数或从函数返回。它的界面可以更方便地查找大小,并与 STL 风格的基于迭代器的算法一起使用。

它的性能更高吗?

它应该完全相同。根据定义,它是一个简单的聚合,包含一个数组作为其唯一成员。

只是更容易处理复制/访问?

是的。

原文由 Mike Seymour 发布,翻译遵循 CC BY-SA 3.0 许可协议

它的性能更高吗?

它应该完全相同。根据定义,它是一个简单的聚合,包含一个数组作为其唯一成员。

情况似乎更复杂,因为 std::array 与 C-array 相比,根据特定平台并不总是产生相同的汇编代码。

我在 Godbolt 上测试了这种特定情况:

 #include <array>
void test(double* const C, const double* const A,
          const double* const B, const size_t size) {
  for (size_t i = 0; i < size; i++) {
    //double arr[2] = {0.e0};//
    std::array<double, 2> arr = {0.e0};//different to double arr[2] for some compiler
    for (size_t j = 0; j < size; j++) {
      arr[0] += A[i] * B[j];
      arr[1] += A[j] * B[i];
    }
    C[i] += arr[0];
    C[i] += arr[1];
  }
}

GCCClang 为 C-array 版本和 std::array 版本生成相同的汇编代码。

但是, MSVCICPC 为每个数组版本生成不同的汇编代码。 (我用 -Ofast-Os 测试了 ICPC19;MSVC -Ox-Os

我不知道为什么会这样(我确实希望 std::array 和 c-array 的行为完全相同)。也许采用了不同的优化策略。

另外一点:ICPC 中似乎有一个错误

#pragma simd

在某些情况下使用 c-array 时进行矢量化(c-array 代码产生错误的输出; std::array 版本工作正常)。

不幸的是,我还没有一个最小的工作示例,因为我在优化一段相当复杂的代码时发现了这个问题。

当我确定我不只是误解了有关 C-array/ std::array#pragma simd 的某些内容时,我将向英特尔提交错误报告。

原文由 Henryk 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题