신기한 swtich case (duff's device)
2009/12/14
qt 4.6 안에 있는 코드..
매직아이 보듯이 보면 이상한 곳이 보일꺼임.
우주는 오묘하다..
강바닥이나 파자.
template <class T>
inline void qt_memfill(T *dest, T value, int count)
{
int n = (count + 7) / 8;
switch (count & 0x07)
{
case 0: do { *dest++ = value;
case 7: *dest++ = value;
case 6: *dest++ = value;
case 5: *dest++ = value;
case 4: *dest++ = value;
case 3: *dest++ = value;
case 2: *dest++ = value;
case 1: *dest++ = value;
} while (--n > 0);
}
}
illust 님의 제보로 더욱 자세한 사실을 알게 됨.
http://en.wikipedia.org/wiki/Duff%27s_device
위키에서 풀어쓴 동치인 코드를 인용하면 이렇다. 이제 이해하기가 쉽다. 즉, 루프 깨기 (loop unrolling)를 하면서 패딩을 처리하는 것이다.
send(to, from, count)
register short *to, *from;
register count;
{
register n = (count + 7) / 8;
switch (count % 8) {
case 0: *to = *from++;
case 7: *to = *from++;
case 6: *to = *from++;
case 5: *to = *from++;
case 4: *to = *from++;
case 3: *to = *from++;
case 2: *to = *from++;
case 1: *to = *from++;
}
while (--n > 0) {
*to = *from++;
*to = *from++;
*to = *from++;
*to = *from++;
*to = *from++;
*to = *from++;
*to = *from++;
*to = *from++;
}
}