C se nestará o řetězce. Ve skutečnosti.
Zachází s nimi jako s poli znaků. Jen bajty v paměti. Abyste je mohli efektivně používat, potřebujete ukazatele. Ne proto, že by to bylo zábavné. Ale protože bez nich děláte práci navíc.
Řetězec v C je jednoduše char str[100]. Vypadá to na místo pro 100 znaků. Ale to není pravda. Toto je prostor pro 99 znaků plus terminátor. C používá řetězce zakončené nulou. Každý řádek končí hodnotou ASCII 0. Zapisuje se jako '\0'.
Tím se vše mění.
Jiné jazyky zacházejí s řetězci jinak. Pascal používá bajt délky. Přesně ví, kolik znaků je uloženo. Zeptat se na délku? Vrátí tento bajt. Okamžitě.
V C se musí počítat. Čte data, dokud nenarazí na '\0'. Díky tomu je C v některých případech pomalejší. U ostatních rychleji. Vše záleží na tom, co děláte.
C nemá nativní podporu pro řetězce. Spoléháte na knihovny. zpracovává vstup a výstup, funkce jako gets a puts. obsluhuje manipulaci s řetězci. Některé systémy používají . S pamětí si musíte poradit sami. Nemůžete jen tak přiřadit jedno pole druhému.
To je vše. Kopírujete prvek po prvku. Nebo použijte strcpy. Funkce knihovny dělá hlavní práci.
strcpy je všude v C. Inicializuje řetězce. Kopíruje data.
Po provedení tohoto kódu obsahuje s1 “hello” a s2 také obsahuje “hello”. Pole ukládá hodnoty ASCII. Celá čísla. h je 104. e je 101. C myslí v bajtech. Myslíš v textu. Autu je to jedno.
Porovnání se provádí pomocí strcmp. Vrátí celé číslo.
Nula znamená rovnost. Záporná hodnota znamená, že první řádek je menší. Kladná hodnota znamená, že je větší.
Existují i další funkce. strlen vrátí délku. strcat provádí zřetězení. Pokud potřebujete další informace, přečtěte si manuálovou stránku.
Jak ale tyto funkce fungují zevnitř? Podívejme se na strlen.
Naivní přístup vypadá takto:
Většina programátorů C tento kód nenávidí. Zdá se to být neúčinné. Dávají přednost ukazatelům.
Dá se ještě více stlačit.
Opravdový odborník by to asi mohl zkrátit.
Tyto možnosti jsem zkompiloval na MicroVAX pomocí gcc. Žádná optimalizace. Každá varianta byla provedena 20 000krát na lince o 120 znacích.
První možnost: 12,3 sekundy.
Druhá možnost: 12,3 sekundy.
Třetí možnost: 12,9 sekund.
Ukazatelé ne vždy vyhrávají.
Napište kód, kterému rozumíte. Čitelnost je důležitější než několik mikrosekund. Pokud nejste v těsném závěsu. Pak by možná stálo za to provést optimalizaci.
strcpy prochází podobným vývojem.
Začněme tím, co je zřejmé:
Všimněte si “<=". Zkopíruje ‘\0’. Pokud to přeskočíte, řádek nekončí. Neznámá délka. Chyby později. Je těžké je najít.
Tato verze je neúčinná. strlen se volá při každé iteraci. Zavolej jí jednou.
Nyní ukazatele.
Zmáčkněte to.
Čistý. Rychle. Je to nebezpečné, pokud nekontrolujete své hranice.
Takto fungují struny v C. Žádná magie. Jen paměť a ukazatele. A hodně pečlivého počítání.
Ukazatele vs. výkon ve strcpy
Technicky můžete napsat while (*s1++ = *s2++);, abyste zvládli kopírování řádků. Rozdíl ve výkonu mezi naivními a optimalizovanými implementacemi je ohromující.
Vezměte strcpy. První verzi trvá 415 sekund, než zkopíruje 120znakový řetězec 10 000krát. Druhá verze? 14,5 sekundy. Třetí klesá na 9,8 sekundy. Čtvrtý se ustálí kolem 10,3 sekundy.
To není zanedbatelný rozdíl. To je obrovský nárůst rychlosti. Ukazatele poskytují tuto rychlost, protože eliminují zbytečnou režii.
Vrátí typy a ukazatele na řetězce
Prototyp strcpy v knihovně řetězců odhaluje svůj účel:
Většina řetězcových funkcí vrací ukazatel na řetězec. strcpy jako výsledek vrátí hodnotu s1. To vám umožní provést řetězec operací nebo okamžitě použít zkopírovaný řetězec bez dalšího hledání.
Odstraňte úvodní mezery bez přesunutí dat
Použití ukazatelů s řetězci často vede k určitému zlepšení rychlosti. S trochou přemýšlení toho můžete využít.
Řekněme, že chcete z řetězce odstranit úvodní mezery. Instinct vám říká, abyste posouvali znaky a přepisovali mezery. V C se můžete zcela vyhnout pohybu.
To je mnohem rychlejší než technika smyku. Zejména pro dlouhé řady. Neposouváte bajty. Jednoduše měníte počáteční ukazatel. Data zůstávají na svém místě. Závěr se mění.
Zvládnutí technik
Během postupu se naučíte mnoho dalších triků se strunami. Budete číst jiný kód. Uvidíte, jak ostatní pracují s pamětí.
Praxe je klíčem k úspěchu. Pro čtení kódu neexistuje žádná zkratka. Musíte jen sledovat, jak se to dělá, a pochopit, proč to funguje. Nárůst produktivity je skutečný. Křivka učení je strmá. Ale výsledky mluví samy za sebe.



























