Он более производительный?
Он должен быть точно таким же. По определению это простой агрегат, содержащий массив в качестве единственного члена.
Ситуация кажется более сложной, так как 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++) {
//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-массива, так и для версии 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
.
person
Henryk
schedule
14.10.2018
for (auto i = ++std::begin(myArray); . . .
может даже не компилироваться (похоже, что временные массивы фундаментального типа не изменяемы, по крайней мере, не с clang 6) - person Patrick Fromberg   schedule 13.05.2018struct Direction { int32_t dw; int32_t dh; };
иstatic const Direction DIRECTIONS[DIRECTIONS_COUNT] { { -1, 1}, {0,1}, {1,1} , { 1, 0 }, {1,-1}, {0,-1} , {-1,-1}, {-1,0} };
компилируются. Но если вы измените наstd::array<Direction,DIRECTIONS_COUNT>
с тем же списком инициализаторов, внезапно вы получите слишком много ошибок инициализаторов. (Сообщество VS 2019 с языком = C++17) - person BitTickler   schedule 09.10.2019std::array
? - person Marc.2377   schedule 09.12.2019std::array
- это просто оболочка для массивов в стиле C. Если я не ошибаюсь, в некоторых более ранних версиях C++ вы не могли инициализировать его одинарными скобками. Однако не верьте мне на слово, так как я не использовал их много - person H-005   schedule 20.07.2020