Comment la longueur dun tableau en C est-elle déterminée?


Meilleure réponse

Ce que vous demandez nest pas clair, mais je suppose que la question est celle donnée un tableau , comment déterminer sa longueur.

C a plusieurs types de tableaux: des tableaux de taille inconnue, des tableaux de taille constante connue et des tableaux de longueur variable.

Pour un tableau de taille constante, la taille fait partie de son type: la longueur dun tableau dont le type est int[10] est que très 10. C na pas de mécanisme pour extraire cela directement du type (contrairement au C ++ ), mais vous pouvez le faire indirectement via sizeof:

int a[] = {1,2,3,4,5,6,7,8,9,0};

size\_t sz = sizeof a / sizeof *a; // or .../sizeof a[0], same thing

printf("size = \%zu\n", sz);

La taille dun tableau de longueur variable peut également être calculée avec sizeof, avec un code identique. Dans ce cas, il sexécute à lexécution:

scanf("\%d", &x);

int a[x];

size\_t sz = sizeof a / sizeof *a;

printf("size = \%zu\n", sz);

Enfin, les tableaux de bornes inconnues ont, par définition, taille inconnue. Vous devrez lobtenir via la logique du programme

extern int a[];

size\_t sz = something\_from\_the\_module\_that\_defines\_a();

Une mise en garde, bien sûr, les tableaux nus en C ne peuvent pas être passés aux fonctions, et les tailles doivent donc être calculées du côté de lappelant et passées séparément:

void f(int *a, size\_t sz);

int a[] = {1,2,3,4,5,6,7,8,9,0};

f(a, sizeof a / sizeof *a);

Les tableaux membres peuvent bien sûr être passés aux fonctions par valeur:

struct a10 {int a[10];};

void f(struct a10 s) {

size\_t sz = sizeof s.a / sizeof *s.a;

}

Réponse

Une question majeure est la suivante: allez-vous effectuer plusieurs recherches? Si tel est le cas, créez une table de hachage ou un autre index une fois pour trouver des éléments rapidement. Une table de hachage pourrait être générée en même temps que les données sont lues à partir du disque (si cest de là quelles viennent).

Sil sagit dune chose ponctuelle et que les données sont chargées à partir du disque, faites la recherche chevauchait lIO. 2 tampons ou plus peuvent être utilisés.

Une autre question est de savoir si quelque chose est présent ou y a-t-il des données associées que vous souhaitez récupérer? Si vous voulez juste savoir si un nombre est présent, un tableau de bits peut être utilisé pour une représentation plus compacte.

À part cela, le code C en ligne utilisant la comparaison la plus rapide est le meilleur; Utilisez toutes les options doptimisation fournies par le compilateur. Certains compilateurs peuvent générer le même code rapide, que vous utilisiez des pointeurs, des compteurs ou une indexation:

int * first = ..., * last = ...;

for ( ; first <= last; ++first ) if ( *first == target ) ...

ou

int * first = ..., count = ...;

for ( ; count-- > 0; ++first ) if ( *first == target ) ...

ou

int * first = ..., count = ..., index = ...;

for ( ; index < count; ++index ) if ( first[index] == target ) ...

Vous pourriez considérer quil est triche de demander au compilateur de sortir la source de lassembleur pour avoir une idée de ce quil fait, mais les compilateurs inférieurs pourraient en avoir besoin si vous êtes vraiment préoccupé par les performances - juste pour voir quelle forme de code C génère le meilleur résultat.

Ensuite, il y a dautres choses que vous pouvez faire comme utiliser plusieurs threads: si vous avez 8 cœurs disponibles, vous pouvez diviser le tableau en 8 sections et lancer un thread pour chaque section. Mais le coût de démarrage des threads peut être trop élevé si le coût de comparaison est faible.

Le tableau peut être volumineux, donc léchange de mémoire virtuelle pourrait ralentir les choses. Lutilisation de votre propre sauvegarde de fichiers mappés en mémoire peut vous permettre de contrôler vous-même le mappage et le démappage afin de réduire lutilisation de la mémoire physique. Vous pouvez démapper une section que vous venez de terminer la recherche afin que la mémoire puisse être utilisée pour les sections ultérieures.

Juste quelques idées. Bonne chance.

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *