如果我想构建一个非常简单的数组,例如:
int myArray[3] = {1,2,3};
我应该使用 std::array
代替吗?
std::array<int, 3> a = {{1, 2, 3}};
使用 std::array
相比普通有什么优势?它的性能更高吗?只是更容易处理复制/访问?
原文由 Arcyno 发布,翻译遵循 CC BY-SA 4.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];
}
}
GCC 和 Clang 为 C-array 版本和 std::array
版本生成相同的汇编代码。
但是, MSVC 和 ICPC 为每个数组版本生成不同的汇编代码。 (我用 -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 许可协议
3 回答2k 阅读✓ 已解决
2 回答3.9k 阅读✓ 已解决
2 回答3.2k 阅读✓ 已解决
1 回答3.2k 阅读✓ 已解决
1 回答2.7k 阅读✓ 已解决
3 回答3.4k 阅读
1 回答1.6k 阅读✓ 已解决
它具有友好的值语义,因此可以按值传递给函数或从函数返回。它的界面可以更方便地查找大小,并与 STL 风格的基于迭代器的算法一起使用。
它应该完全相同。根据定义,它是一个简单的聚合,包含一个数组作为其唯一成员。
是的。