Come viene determinata la lunghezza di un array in C?


Migliore risposta

Non è chiaro cosa stai chiedendo, ma presumo che la domanda sia quella data un array , come si determina la sua lunghezza.

C ha diversi tipi di array: array di dimensione sconosciuta, array di dimensione costante nota e array di lunghezza variabile.

Per un array di dimensione costante, la dimensione fa parte del suo tipo: la lunghezza di un array il cui tipo è int[10] è proprio quella 10. C non ha alcun meccanismo per estrarlo direttamente dal tipo (a differenza di C ++ ), ma puoi farlo indirettamente tramite 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 dimensione di un array di lunghezza variabile può anche essere calcolata con sizeof, con codice identico. In tal caso, viene eseguito in fase di esecuzione:

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

int a[x];

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

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

Infine, gli array con limite sconosciuto hanno, per definizione, dimensione sconosciuta. Dovresti ottenerlo attraverso la logica del programma

extern int a[];

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

Un avvertimento, ovviamente, gli array nudi in C non possono essere passati alle funzioni, quindi le dimensioni devono essere calcolate dal lato del chiamante e passate separatamente:

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);

gli array dei membri possono ovviamente essere passati alle funzioni in base al valore:

struct a10 {int a[10];};

void f(struct a10 s) {

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

}

Risposta

Una domanda importante è che effettuerai più ricerche? In tal caso, crea una tabella hash o un altro indice una volta per trovare le cose rapidamente. Una tabella hash potrebbe essere generata nello stesso momento in cui i dati vengono letti dal disco (se è da lì che provengono).

Se questa è una cosa una tantum e i dati vengono caricati dal disco, fallo la ricerca si è sovrapposta allIO. È possibile utilizzare 2 o più buffer.

Unaltra domanda è: sei interessato solo a sapere se è presente qualcosa o ci sono dati associati che desideri recuperare? Se vuoi solo sapere se è presente un numero, un array di bit potrebbe essere utilizzato per una rappresentazione più compatta.

A parte questo, il codice C inline che utilizza il confronto più veloce è il migliore; Usa tutte le opzioni di ottimizzazione fornite dal compilatore. Alcuni compilatori potrebbero generare lo stesso codice veloce indipendentemente dallutilizzo di puntatori, contatori o indicizzazione:

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

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

o

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

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

o

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

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

Potresti considerare un imbroglio chiedere al compilatore di visualizzare il sorgente dellassembler per avere unidea di cosa sta facendo, ma compilatori minori potrebbero richiederlo se sei veramente preoccupato per le prestazioni - solo per vedere quale forma di codice C genera il miglior risultato.

Poi ci sono altre cose che puoi fare come usare più thread: se hai 8 core disponibili, potresti dividere larray in 8 sezioni e lanciare un thread per ogni sezione. Ma il costo di avvio dei thread potrebbe essere troppo alto se il costo di confronto è basso.

Larray potrebbe essere grande, quindi lo scambio di memoria virtuale potrebbe rallentare le cose. Lutilizzo del supporto di file mappato in memoria potrebbe consentire di controllare la mappatura e lannullamento della mappatura per mantenere basso lutilizzo della memoria fisica. Potresti annullare la mappatura di una sezione che hai appena finito di cercare in modo che la memoria possa essere utilizzata per sezioni successive.

Solo alcune idee. Buona fortuna.

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *