web-dev-qa-db-fra.com

performances std :: array vs array

Si je veux construire un tableau très simple comme

int myArray[3] = {1,2,3};

Dois-je utiliser std::array au lieu ?

std::array<int, 3> a = {{1, 2, 3}};

Quels sont les avantages d'utiliser std :: array par rapport à ceux habituels? Est-ce plus performant? Simplement plus facile à manipuler pour la copie/l'accès?

46
Arcyno

Quels sont les avantages de l'utilisation de std::array par rapport à ceux habituels?

Il a une sémantique de valeur conviviale, de sorte qu'il peut être transmis ou renvoyé par les fonctions par valeur. Son interface facilite la recherche de la taille et l'utilisation avec des algorithmes basés sur un itérateur de style STL.

Est-ce plus performant?

Ce devrait être exactement la même chose. Par définition, il s'agit d'un simple agrégat contenant un tableau comme seul membre.

Simplement plus facile à manipuler pour la copie/l'accès?

Oui.

65
Mike Seymour

UNE std::array est un wrapper très fin autour d'un tableau de style C, essentiellement défini comme

template<typename T, size_t N>
class array
{
public:
    T _data[N];
    T& operator[](size_t);
    const T& operator[](size_t) const;
    // other member functions and typedefs
};

C'est un agrégat , et il vous permet de l'utiliser presque comme un type fondamental (c'est-à-dire que vous pouvez passer par valeur, affecter etc., alors qu'un tableau C standard ne peut pas être assigné ou copié directement vers un autre tableau). Vous devriez jeter un œil à une implémentation standard (passez à la définition de votre favori IDE ou ouvrez directement <array>), c'est un morceau de la bibliothèque standard C++ qui est assez facile à lire et à comprendre.

24
vsoftco

std::array est conçu comme un wrapper zéro pour les tableaux C qui lui donne la valeur "normale" comme la sémantique des autres conteneurs C++.

Vous ne devriez pas remarquer de différence dans les performances d'exécution pendant que vous profitez toujours des fonctionnalités supplémentaires.

En utilisant std::array au lieu de int[] les tableaux de style sont une bonne idée si vous avez C++ 11 ou un boost à portée de main.

17
Baum mit Augen

std::array a une sémantique de valeur contrairement aux tableaux bruts. Cela signifie que vous pouvez copier std::array et le traiter comme une valeur primitive. Vous pouvez les recevoir par valeur ou référence comme arguments de fonction et vous pouvez les renvoyer par valeur.

Si vous ne copiez jamais un std::array, il n'y a pas de différence de performances par rapport à un tableau brut. Si vous devez faire des copies, alors std::array fera la bonne chose et devrait toujours donner des performances égales.

4
b4hand

Est-ce plus performant?

Ce devrait être exactement la même chose. Par définition, il s'agit d'un simple agrégat contenant un tableau comme seul membre.

La situation semble être plus compliquée, car std :: array ne produit pas toujours un code d'assemblage identique par rapport à C-array selon la plate-forme spécifique.

J'ai testé cette situation spécifique sur godbolt.org:

#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 et Clang produisent un code d'assemblage identique pour la version C-array et la version std :: array.

MSVC et ICPC, cependant, produisent un code d'assemblage différent pour chaque version de la baie. (J'ai testé ICPC19 avec -Ofast et -Os; MSVC -Ox et -Os)

Je n'ai aucune idée, pourquoi c'est le cas (je m'attendrais en effet à un comportement exactement identique de std :: array et c-array). Il existe peut-être différentes stratégies d'optimisation.

Petit plus: il semble y avoir un bug dans icpc avec

#pragma simd 

pour la vectorisation lors de l'utilisation du c-array dans certaines situations (le code du c-array produit une sortie incorrecte; la version std :: array fonctionne très bien). Malheureusement, je n'ai pas encore d'exemple minimal pour cela, car j'ai découvert ce problème en optimisant un morceau de code assez compliqué. Je déposerai un rapport de bogue à Intel quand je suis sûr que je n'ai pas simplement oublié quelque chose à propos de c_array/std :: array et #pragma simd.

3
Henryk