Ist es performanter?
Es sollte genau das gleiche sein. Per Definition ist es ein einfaches Aggregat, das ein Array als einziges Mitglied enthält.
Die Situation scheint komplizierter zu sein, da std::array
je nach Plattform nicht immer identischer Assembler-Code im Vergleich zu C-Array erzeugt wird.
Ich habe diese spezielle Situation auf Godbolt getestet :
#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 und Clang erzeugen identischen Assemblycode sowohl für die C-Array-Version als auch für die std::array
Version.
MSVC und ICPC erzeugen jedoch für jede Array-Version unterschiedliche Assembler-Codes. (Ich habe ICPC19 mit -Ofast
und getestet -Os
; MSVC -Ox
und -Os
)
Ich habe keine Ahnung, warum dies der Fall ist (ich würde in der Tat ein genau identisches Verhalten von std :: array und c-array erwarten). Möglicherweise werden verschiedene Optimierungsstrategien angewendet.
Als kleines Extra: Es scheint einen Fehler in ICPC mit zu geben
#pragma simd
zur Vektorisierung bei Verwendung des C-Arrays in bestimmten Situationen (der C-Array-Code erzeugt eine falsche Ausgabe; die std::array
Version funktioniert einwandfrei).
Leider habe ich noch kein minimales Arbeitsbeispiel dafür, da ich dieses Problem bei der Optimierung eines ziemlich komplizierten Codeteils entdeckt habe.
Ich werde einen Fehlerbericht an Intel senden, wenn ich sicher bin, dass ich nicht nur etwas über C-Array / std::array
und falsch verstanden habe #pragma simd
.