Fordul ez a kód? Csinál valamit?
[source:c++]
int c = 8;
char b[] = ” “;
char alma[] = “almaalma”;
char* a = alma;
switch (c % 8)
{
case 0: do { *b = *a++;
case 7: *b = *a++;
case 6: *b = *a++;
case 5: *b = *a++;
case 4: *b = *a++;
case 3: *b = *a++;
case 2: *b = *a++;
case 1: *b = *a++;
} while ((c -= 8) > 0);
}
[/source]
Could you hire me? Contact me if you like what I’ve done in this article and think I can create value for your company with my skills.
LEAVE A COMMENT
9 COMMENTS
>Fordul ez a kód?
Remélem, nem! ;-)
Honnan szedted?
Majd elmondom, de egyelőre még várom, más mit szól hozzá.
Szornyusegesen nez ki, de fordul, sot! mukodik. http://en.wikipedia.org/wiki/Duff's_device
Magamtól szörnyülködtem. Megnéztem a Wikin…
…s ilyenkor mindig rájövök mennyire nem is értek a programozáshoz. El kéne mennem favágónak.
Hogy futottál bele?
Ezek után kíváncsi lennék a memcpy implementációjára…
Ebben az esetben szívesen rácsapnék a kezére annak aki azt a fordítót írta, amin ez lefordul.
Szerintem már a QBasic is szólt, ha Goto-val egy ciklusmagba akart az ember fia (kívülről) ugrani…
Linuxon nem lehet megetetni…
merlin ~ # gcc -c duff.c
duff.c:6: error: syntax error before "switch"
merlin ~ #
És
merlin ~ # gcc -c duff.cpp
duff.cpp:6: error: expected unqualified-id before "switch"
merlin ~ # mv duff.cpp duff.c
Bár érdekes, hogy minden formában a switch előtt jelez hibát, nem pedig a do belsejében. Hmmm…
Ez az egyik legfontosabb optimalizációs eljárás, ami kihasználja a proci pipeline-t, 50-70 % os gyorsulást okoz. Érdemes megjegyezni. Ha tudjuk, hogy a tömb mérete pl. 5-el osztható, akkor nem kell ilyen csúnya kód :)
Amúgy nem csúnya, a switch utasítása specifikációja volt annó elcseszve.
C#-ben kötelező a break :)