Чудеса извращений (программистское)
Mar. 28th, 2009 08:43 am![[personal profile]](https://www.dreamwidth.org/img/silk/identity/user.png)
До оптимизации:
Но для меня интересно здесь другое, а именно переплетение switch {} и do {}. Я и не догадывался, что стандарт C позволяет внутри switch писать структуры с вложенностью и помещать метки case перед любыми их операторами на любом уровне вложенности, а не только непосредственно под switch.
Правда сам я написал бы подобный код только за очень большие деньги. Такие, чтобы я мог до конца жизни больше не писать программы :).
Ыкс: http://en.wikipedia.org/wiki/Duffs_device
do { *to = *from++; } while (--count > 0);После оптимизации:
int n = (count + 7) / 8; switch (count % 8) { case 0: do { *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); }Смысл оптимизации здесь - уменьшить кол-во итераций цикла, тем самым уменьшив число сравнений (прием называется Размотка цикла).
Но для меня интересно здесь другое, а именно переплетение switch {} и do {}. Я и не догадывался, что стандарт C позволяет внутри switch писать структуры с вложенностью и помещать метки case перед любыми их операторами на любом уровне вложенности, а не только непосредственно под switch.
Правда сам я написал бы подобный код только за очень большие деньги. Такие, чтобы я мог до конца жизни больше не писать программы :).
Ыкс: http://en.wikipedia.org/wiki/Duffs_device