Це ефективніше?
Це повинно бути точно так само. За визначенням, це простий агрегат, що містить масив як єдиний його член.
Ситуація видається більш складною, оскільки std::array
не завжди виробляється однаковий код збірки порівняно з C-масивом, залежно від конкретної платформи.
Я протестував цю конкретну ситуацію на болті :
#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-масиву видає неправильний результат; std::array
версія працює нормально).
На жаль, у мене поки що немає мінімального робочого прикладу для цього, оскільки я виявив цю проблему, оптимізуючи досить складний фрагмент коду.
Я подам звіт про помилки в Intel, коли буду впевнений, що я не просто щось неправильно зрозумів щодо C-array / std::array
і #pragma simd
.