Qu’est-ce qui est plus rapide dans C: structures ou tableaux?

Je veux implémenter (ce qui représente abstraitement) une masortingce 4×4 bidimensionnelle. Tout le code que j’écris pour la multiplication de masortingce et cetera sera entièrement “déroulé” pour ainsi dire, c’est-à-dire que je n’utiliserai pas de boucles pour accéder aux entrées de données et les écrire dans la masortingce.

Ma question est la suivante: en C, serait-il plus rapide d’utiliser une structure en tant que telle:

typedef struct { double e0, e1, e2, e3, e4, ..., e15 } My4x4Masortingx; 

Ou serait-ce plus rapide:

 typedef double My4x4Masortingx[16]; 

Étant donné que je vais accéder à chaque élément de la masortingce individuellement en tant que tel:

 My4x4Masortingx a,b,c; // (Some initialization of a and b.) ... c.e0=a.e0+b.e0; c.e1=a.e1+b.e1; ... 

Ou

 My4x4Masortingx a,b,c; // (Some initialization of a and b.) ... c[0]=a[0]+b[0]; c[1]=a[1]+b[1]; ... 

Ou sont-ils exactement la même vitesse?

Tout compilateur correct générera exactement le même code, octet par octet. Cependant, l’utilisation de tableaux vous permet beaucoup plus de flexibilité. Lorsque vous accédez aux éléments de la masortingce, vous pouvez choisir si vous souhaitez accéder à des emplacements fixes ou à des adresses avec des variables.

Je mets également fortement en doute votre choix de “décompresser” (dérouler?) Toutes les opérations à la main. Tout bon compilateur peut entièrement dérouler des boucles avec un nombre constant d’itérations pour vous, et peut même générer du code SIMD et / ou planifier de manière optimale l’ordre des instructions. Vous aurez du mal à faire mieux à la main et vous obtiendrez un code hideux à lire. Le fait que vous ayez posé cette question me fait penser que vous n’êtes probablement pas suffisamment expérimenté pour faire mieux qu’un compilateur d’optimisation naïf.

Les éléments de structure (champs) sont uniquement accessibles avec leur nom explicitement spécifié dans la source du programme, ce qui signifie que chaque fois que vous accédez à un champ, ce dernier doit être sélectionné et codé en dur lors de la compilation. Si vous vouliez implémenter la même chose avec des tableaux, cela signifierait que vous utiliseriez des indices de tableau explicites à la compilation (comme dans votre exemple). Dans ce cas, les performances des deux seront exactement les mêmes et le code généré sera exactement le même (à l’exclusion des compilateurs “malveillants”).

Toutefois, notez que les tableaux vous offrent un degré de liberté supplémentaire: si nécessaire, vous pouvez sélectionner des éléments de tableau à l’aide d’un index d’exécution. C’est quelque chose qui n’est pas possible avec les structures. Seulement, vous savez si cela compte pour vous.

D’autre part, notez également que les tableaux en C ne sont pas copiables, ce qui signifie que vous serez obligé d’utiliser memcpy pour copier votre My4x4Masortingx basée sur des My4x4Masortingx . Avec la version basée sur struct, la copie normale au niveau de langue fonctionnera. Avec les tableaux, ce problème peut être résolu en encapsulant le tableau dans une structure.

Je suppose que les deux ont la même vitesse. La différence entre une structure et un tableau réside simplement dans sa signification (en termes humains). Les deux seront compilés en tant qu’adresses mémoire.

Je dirais que le meilleur moyen est de créer un test pour l’essayer vous-même. Les résultats peuvent varier en fonction des environnements système et des compilateurs.