Jak je určena délka pole v C?


Nejlepší odpověď

Je trochu nejasné, na co se ptáte, ale předpokládám, že otázkou je, že dané pole , jak určíte jeho délku.

C má několik typů polí: pole neznámé velikosti, pole známé konstantní velikosti a pole proměnné délky.

Pro pole konstantní velikost, velikost je součástí jeho typu: délka pole, jehož typ je int[10], je velmi 10. C nemá žádný mechanismus pro jeho extrahování přímo z typu (na rozdíl od C ++ ), ale můžete to udělat nepřímo prostřednictvím 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);

Velikost pole s proměnnou délkou lze vypočítat také pomocí sizeof se stejným kódem. V takovém případě se provede za běhu:

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

int a[x];

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

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

Nakonec pole neznámé vazby mají, podle definice, neznámá velikost. Museli byste to získat prostřednictvím logiky programu

extern int a[];

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

Jedno upozornění, samozřejmě, nahá pole v C nelze předat funkcím, a proto je třeba vypočítat velikosti na straně volajícího a předat je samostatně:

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

členské pole lze samozřejmě předávat do funkcí podle hodnoty:

struct a10 {int a[10];};

void f(struct a10 s) {

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

}

Odpověď

Hlavní otázkou je, zda budete hledat vícekrát? Pokud ano, vytvořte hash tabulku nebo jiný index, abyste věci rychle našli. Hash tabulku lze vygenerovat současně s načítáním dat z disku (pokud to je místo, odkud pochází).

Pokud se jedná o jednorázovou věc a data se načítají z disku, proveďte vyhledávání se překrývalo s IO. Mohou být použity 2 nebo více vyrovnávacích pamětí.

Další otázkou je, zda vás zajímá jen to, zda je něco přítomné, nebo existují související data, která chcete načíst? Pokud chcete jen vědět, jestli je číslo přítomné, může být pro kompaktnější zobrazení použito bitové pole.

Kromě toho je nejlepší inline C kód využívající nejrychlejší porovnání; Použijte všechny možnosti optimalizace, které kompilátor poskytuje. Někteří kompilátoři mohou vygenerovat stejný rychlý kód bez ohledu na to, zda používáte ukazatele, čítače nebo indexování:

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

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

nebo

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

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

nebo

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

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

Můžete považovat za podvádění, když požádáte kompilátor o výstup zdroje assembleru, abyste získali představu o tom, co dělá, ale menší kompilátoři to mohou vyžadovat, pokud se skutečně zajímáte o výkon - jen abyste zjistili, jaká forma kódu C generuje nejlepší výsledek.

Pak můžete udělat i další věci, například použít více vláken: Pokud máte k dispozici 8 jader, můžete pole rozdělit na 8 sekcí a spustit vlákno pro každou sekci. Náklady na spuštění vláken však mohou být příliš vysoké, pokud jsou náklady na srovnání nízké.

Pole může být velké, takže výměna virtuální paměti by to mohla zpomalit. Použití vlastního zálohování mapovaných souborů v paměti vám může umožnit ovládat mapování a mapování, abyste udrželi nízké využití fyzické paměti. Mohli byste zmapovat část, kterou jste právě dokončili prohledávání, takže paměť by mohla být použita pro pozdější sekce.

Jen pár nápadů. Hodně štěstí.

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *