Он более производительный?
Должно быть точно так же. По определению, это простой агрегат, единственным членом которого является массив.
Ситуация кажется более сложной, поскольку std::array
не всегда получается идентичный ассемблерный код по сравнению с C-массивом в зависимости от конкретной платформы.
Я тестировал эту конкретную ситуацию на 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++) {
std::array<double, 2> arr = {0.e0};
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-массива, так и для std::array
версии.
Однако MSVC и ICPC создают разный код сборки для каждой версии массива. (Я тестировал ICPC19 с -Ofast
и -Os
; MSVC -Ox
и -Os
)
Я понятия не имею, почему это так (я действительно ожидал точно идентичного поведения std :: array и c-array). Возможно, используются разные стратегии оптимизации.
В качестве небольшого дополнения: похоже, что в ICPC есть ошибка с
#pragma simd
для векторизации при использовании c-массива в некоторых ситуациях (код c-array дает неверный результат; std::array
версия работает нормально).
К сожалению, у меня пока нет минимального рабочего примера для этого, так как я обнаружил эту проблему при оптимизации довольно сложного фрагмента кода.
Я отправлю отчет об ошибке в Intel, когда буду уверен, что я не просто неправильно понял что-то о C-array / std::array
и #pragma simd
.