Страницы

Поиск по вопросам

четверг, 4 октября 2018 г.

Какое может быть практическое обоснование такой комбинации switch и while?

На просторах сети нашел несколько "странное" применение конструкций языка. Вот небольшой пример, который я набросал сам, просто по "шаблону":
#include using namespace std;
void foo(const int i) { cout << "foo(" << i <<")" << endl; }
int main() { int c = 10; switch(c&3) while((c-=4)>=0) { foo(c); case 3: foo(c); case 2: foo(c); case 1: foo(c); case 0:; } return 0; }
Специально для незнающих не раскрываю "мелочи", пусть будет интригой) От "знающих" прошу чисто практический пример - и с объяснениями мелочей. Почему сия конструкция иногда (или часто?) дает профит.


Ответ

Это по сути ручная размотка цикла, известная как Duff's device. Сейчас она практически не нужна, так как современные компиляторы делают это сами, если считают нужным. (А «считать нужным» они умеют намного лучше нас.)
Для старых компиляторов имело смысл, т. к. позволяло сэкономить на управлении циклом, выполняя по нескольку итераций (в вашем случае — 4) за раз. Странный код с switch нужен, понятно, для того, чтобы правильно работал случай, когда длина цикла не кратна размеру размотки.

Комментариев нет:

Отправить комментарий