julien_54 a écrit :
Une structure A posséde un champ qui est un tableau de structure B. Mon premier reflexe a alors été de créer un tableau de pointeurs sur struct B dans A (ce qui donnait struct B **tab_b).
On pouvait alors accéder aux champs de B avec A->B[i]->champ
|
En lisant ta description moi j'aurais plutôt écrit "A.B[i]->champ". Mais c'est un détail, "A" doit probablement être un pointeur sur une "struct A"...
julien_54 a écrit :
Ensuite, relisant mon code, et suite à plusieurs discussions, j'ai décidé qu'il était inutile de surcharger la mémoire avec un tableau de pointeurs, mais plutot mettre directement un tableau de structures... je me suis dit qu'avec une indirection en moins, cela accelererait le code. Donc c'est parti, maintenant j'ai struct B *tab_b dans A,
et j'y accède avec A->B[i].champ
|
Idem remarque précédente...
Premier cas:
Tu as des tas de structures B un peu partout
Tu as aussi une structure A qui contient les adresses de chaque structure B
On peut schématiquement représenter ça (c'est pas évident sans dessin) où toutes ces structures B baguenaudent de ci, de là (instant poésie)... mais tu as chaque fois leurs adresses pour les référencer. Pour simplifier, ce serait presque comme une liste chaînée ou une inode. Mais la structure A reste elle-même très légère car elle ne mémorise que des adresses.
Second cas
Ta structure A a été modifiée et contient maintenant l'ensemble de tes structures B qui se suivent en mémoire. Elle est maintenant bien plus lourde à gérer.
A chaque fois que tu fais "A.B[i]" le compilo doit décaler non pas de "i * sizeof(adresse)" octets mais "i * sizeof(B)" octets. Plus de calcul => plus de temps...
julien_54 a écrit :
Qu'en pensez vous ? Avant tout, cette méthode de gestion des tableaux de structure est elle correcte, ou vaut il mieux garder des tableau de pointeurs lorsque les deux méthodes sont possibles (plus propre ?)
|
Je pense que si tu regardes comment est fait l'inode, tu auras déjà un bon point de repère.
julien_54 a écrit :
Moi je pense que l'optimiseur du compilo se demerdait mieux avec un tableau de pointeur. Je pense aussi qu'avec cette modif, il a plus de mémoire à manipuler pour réallouer...
|
T'as gagné. A une époque on gagnait du temps de calcul sur les tableaux de structures en les taillant à une taille pile poil puissance de 2 (256, 512, 1024, 2048, etc) car cela tombait sur des mots mémoires et l'optimiseurs pouvait décaler plus rapidement mais je ne sais pas si c'est encore utile aujourd'hui. Tu peux essayer de générer l'assembleur pour chaqu'un de tes 2 cas et voir la taille du source généré. C'est un bon point de repère. Mais je pense que le tableau d'adresses est encore ce qu'il y a de plus rapide.
---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.