Portál AbcLinuxu, 1. května 2025 11:04

Nástroje: Začni sledovat (0) ?Zašle upozornění na váš email při vložení nového komentáře.

Vložit další komentář
26.3.2005 10:11 Dataman
Rozbalit Rozbalit vše Pomalé, paměť
Odpovědět | Sbalit | Link | Blokovat | Admin
Nikdy nejde o to napsat co nejméně znaků. Důležitější je spíše optimalizace. Rekurzivní funkce ti zabere spoustu paměti. Schválně, jak ti bude u funkce strlen trvat, než sjede dvacet tisíc znaků a kolik ti zabere paměti. Ta moje ti paměti bude zabírat pořád stejně, ta tvoje ji bude neustále krást.
int strlen(char *a){
  int i=0;
  while(*a)
  {
    ++i;
    ++a;
  }
  return i;
}
Luk avatar 26.3.2005 11:35 Luk | skóre: 47 | blog: Kacířské myšlenky | Kutná Hora
Rozbalit Rozbalit vše Re: Pomalé, paměť
Přesně tak. Rekurzivní funkce se hodí prakticky jen jako cvičení, jako ukázka, že to jde. Ale jsou vždycky pomalejší než totéž udělané iterací, navíc spotřebovávají paměť na zásobníku a ten navíc při "větším" počtu vnoření přeteče. Platí známé pravidlo, co jde udělat rekurzí, jde udělat iterací.
Šifrování je absolutní nutnost a pomáhá chránit před nekalými živly
27.3.2005 16:34 3018736794024648 | blog: plathel
Rozbalit Rozbalit vše Re: Pomalé, paměť

ech.. samozřejmě. úloha zněla ale "nejméně znaků", nikoli nejvýkonnější. Prostě toto není otázka z reálného světa, a nemá smysl se ptát jestli úloha "najděte nejkratší řešení" má smysl, stejně jako nemá smysl mnoho lidské činnosti.

já vím že rekurze je v tomto případě úplná blbost. Nicméně musíš uznat, že pomocí rekurze je to řešení kratší než jiná, běžnější řešení.

26.3.2005 11:15 Martin Čížek | skóre: 20 | Praha
Rozbalit Rozbalit vše strcpy()
Odpovědět | Sbalit | Link | Blokovat | Admin
char *strcpy(char *d, const char *s) 
{
  char *ret = d;
  while ((*d++ = *c++))
    ;
  return ret;
}

P. S. K ,,sestřesení'' kódu do jedné řádky se uchylovat nebudu :-).

P. P. S. Obě funkce se obvykle implementují v asembleru, ,,výkonný kód'' je na i386 tvořen pomocí jedné prefixované instrukce (+ nějaký ten vstup do funkce, cld a leave).

Kdyby dva z nás byli dvěma z nich, všichni z nás by mohli být všemi z nich.
26.3.2005 12:09 unchallenger | skóre: 69 | blog: unchallenger
Rozbalit Rozbalit vše Re: strcpy()
Ad P.P.S. Obvykle už ne. Obvykle je slušný kompilátor (gcc) implementuje přímo a dokáže optimalizovat in-line.
26.3.2005 19:48 Martin Čížek | skóre: 20 | Praha
Rozbalit Rozbalit vše Re: strcpy()
Obecně souhlasím -- je pravda, že mikrooptimalizace se stále více nechávají na kompilátoru, ale existující implementace těchto základních knihovních funkcí na to obvykle nespoléhají. V glibc jsou tyto jednoduché funkce napsané v asembleru pro všechny možné architektury, plus je tam jedna generic implementace v čistém C.

Jak tak na to koukám, v glibc jsou i ,,jemnější'' verze pro i486, i586 atd., které jsou implemetované v asembleru bez prefixových instrukcí (což je asi na procesorech s RISCovými rysy rychlejší).
Kdyby dva z nás byli dvěma z nich, všichni z nás by mohli být všemi z nich.
26.3.2005 20:04 Martin Čížek | skóre: 20 | Praha
Rozbalit Rozbalit vše Re: strcpy()
Špatně jsem si to přečetl tvůj příspěvek, máš samozřejmě pravdu. Ale to není v rozporu s tvrzením o implementaci knihovních funkcí strlen() a strcpy(), i když je pak třeba optimalizovaný kód nepoužívá :-).
Kdyby dva z nás byli dvěma z nich, všichni z nás by mohli být všemi z nich.
27.3.2005 16:44 3018736794024648 | blog: plathel
Rozbalit Rozbalit vše Re: strcpy()
ježda. samozřejmě. jenže tohle řešení má 35 platných znaků.. moje má 33 ;) proto jsem ho dával do blogu, protože je kratší než tahle klasika
26.8.2010 22:08 Jan Turoň
Rozbalit Rozbalit vše Re: Nejkratší implementace strlen a strcpy
Odpovědět | Sbalit | Link | Blokovat | Admin
tahle je taky zajímavá :-)
int strlen(char *str) {
  int i=0;
  for(;*(str+i);i++);
  return i;
}

Založit nové vláknoNahoru

Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.