Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 47, средняя оценка - 4.74
#pragma
Временно недоступен
952 / 223 / 6
Регистрация: 12.04.2009
Сообщений: 921
#1

Что делает данный код и зачем такое кому-нибудь может понадобиться? - C++

08.06.2009, 23:57. Просмотров 6202. Ответов 37
Метки нет (Все метки)

Я ответил на вопрос,но точной формулировки не нашёл,хотел бы свериться(приложения с ответами нет).Задание:
Чёрный ящик.Что делается в данном примере?Зачем кому нибудь может понадобиться подобный код?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
void send (int* to,int* from,int count)
{
    int n = (count+7)/8;
    swith(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);
     }
}
Я так думаю,параметр count содержит количество незаполненных байт(или не байт,но кратно 8-ми) "чего-то",и копируется информация(из массива в массив),пока нужное количество элементов не скопируется.Только меня смущает одна штука:если count%8==7,то не рухнет ли вся программа из-за разорванного цикла?Может это ловушка,чтобы программа вылетела?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
08.06.2009, 23:57     Что делает данный код и зачем такое кому-нибудь может понадобиться?
Посмотрите здесь:
Кто-нибудь может подробно объяснить, что такое allocators, зачем это и что с ними делать? Нигде не нашёл инфы C++
Может кому понадобиться Выключение/перезагрузки компа и завершение сеанса C++
зачем может понадобиться делать операторы виртуальными? C++
Что делает данный код? C++
Что делает данный код? C++
C++ Скажите, что делает данный код?
C++ Обьясните пожайлуста как и что делает данный оператор в этом выражении fState [x][y] ^= 1;. Неполный код привожу ниже.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Evg
Эксперт CАвтор FAQ
17547 / 5785 / 370
Регистрация: 30.03.2009
Сообщений: 15,934
Записей в блоге: 26
09.06.2009, 15:27     Что делает данный код и зачем такое кому-нибудь может понадобиться? #16
Просто 6 услоных переходов - это слишком много. Для intel'а с его длинным конвейером это смерти подобно. Т.е. такой код либо строился в режиме без оптимизаций, либо case'ы были уж очень разреженные
Patch
2276 / 491 / 11
Регистрация: 01.04.2009
Сообщений: 2,178
09.06.2009, 16:02     Что делает данный код и зачем такое кому-нибудь может понадобиться? #17
с оптимизацей.
но не суть важно.
код все равно получается не очень быстрым. по моим понятиям.
а помнится, исследователи еще писали, что в средней программе на каждые 8 команд приходится по одному условному переходу.
из-за чего интел и стал развивать технологию предсказания ветвлений.
так что описанная мной ситуация - это нормально.

Добавлено через 3 минуты 59 секунд
кстати, только что сделал в VC++ код. с оптимизацией на скорость.
C++
1
2
3
4
5
6
7
switch(i)
{
case 1: i = 500;
case 2: i =500000;
case 3: i = 0;
case 8: i = 15;
}
.
в ассемблере это выгляди так:
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
text:00412D22                 jnz     short loc_412D5C
.text:00412D24                 mov     eax, ds:40003Ch
.text:00412D29                 cmp     dword ptr [eax+400000h], 4550h
.text:00412D33                 jnz     short loc_412D5C
.text:00412D35                 mov     ecx, 10Bh
.text:00412D3A                 cmp     [eax+400018h], cx
.text:00412D41                 jnz     short loc_412D5C
.text:00412D43                 cmp     dword ptr [eax+400074h], 0Eh
.text:00412D4A                 jbe     short loc_412D5C
.text:00412D4C                 xor     ecx, ecx
.text:00412D4E                 cmp     [eax+4000E8h], esi
.text:00412D54                 setnz   cl
.text:00412D57                 mov     [ebp-1Ch], ecx
.text:00412D5A                 jmp     short loc_412D5F
пожалуста вам: 4 последовательных сравнения.
Evg
Эксперт CАвтор FAQ
17547 / 5785 / 370
Регистрация: 30.03.2009
Сообщений: 15,934
Записей в блоге: 26
09.06.2009, 16:10     Что делает данный код и зачем такое кому-нибудь может понадобиться? #18
Цитата Сообщение от Patch Посмотреть сообщение
из-за чего интел и стал развивать технологию предсказания ветвлений.
Боюсь ошибиться, но branch prediction вроде бы не на интеле начали развивать.

К тому же статистика про переход на 8 операций - сама по себе ничего не говорит. Важно не сколько переходов, а насколько точно они предсказываются. На целочисленных задах как правило идёт куча ветвлений (if'ов) и предсказываемость здесь хуже. Плавающие задачи в основном состоят из циклов, где предсказатели как правило работаю хорошо. Ну это так, лирика

Цитата Сообщение от Patch Посмотреть сообщение
так что описанная мной ситуация - это нормально.
Если switch нормально пакуется в таблицу - это не нормально. Для компилятора.

Цитата Сообщение от Patch Посмотреть сообщение
C++
1
2
3
4
5
6
7
switch(i)
{
case 1: i = 500;
case 2: i =500000;
case 3: i = 0;
case 8: i = 15;
}
.
в ассемблере это выгляди так:
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
text:00412D22                 jnz     short loc_412D5C
.text:00412D24                 mov     eax, ds:40003Ch
.text:00412D29                 cmp     dword ptr [eax+400000h], 4550h
.text:00412D33                 jnz     short loc_412D5C
.text:00412D35                 mov     ecx, 10Bh
.text:00412D3A                 cmp     [eax+400018h], cx
.text:00412D41                 jnz     short loc_412D5C
.text:00412D43                 cmp     dword ptr [eax+400074h], 0Eh
.text:00412D4A                 jbe     short loc_412D5C
.text:00412D4C                 xor     ecx, ecx
.text:00412D4E                 cmp     [eax+4000E8h], esi
.text:00412D54                 setnz   cl
.text:00412D57                 mov     [ebp-1Ch], ecx
.text:00412D5A                 jmp     short loc_412D5F
пожалуста вам: 4 последовательных сравнения.
В данном случае мы имеем разреженный switch. т.е. в таблице, которая захватывала бы весь диапазон, было бы более 99% дырок. Если отбросить альтернативу в 50000, то остаётся 3 альтернативы, которые незачем лепить в таблицу. Короткие и разреженные switch'и через таблицу не делают, ибо выходит дороже
#pragma
Временно недоступен
952 / 223 / 6
Регистрация: 12.04.2009
Сообщений: 921
09.06.2009, 21:44  [ТС]     Что делает данный код и зачем такое кому-нибудь может понадобиться? #19
Цитата Сообщение от XuTPbIu_MuHTAu Посмотреть сообщение
#pragma,а что значит "разорванный цикл"?) Си - это низкоуровневый ассемблер. Свич тут просто определяет, с какой точки цикл начнется ( причем компилятор тут сделает таблицу джампов,а не кучу сравнений).
Я просто немного недопонимаю пока,как компилируется код,тонкости процесса,поэтому думал,что чтобы цикл вообще начал выполняться,при выполнении программы должна быть "прочитана" первая строка цикла ,а со свитчами как-будто попадаем в разорванный цикл(как-то так).Наивное представление.Но ваши ответы помогли понять,что инструкция цикла сначала компилируется в некий код,и,независимо от switch,цикл будет работать.

Цитата Сообщение от Evg Посмотреть сообщение
А задачка и вправду прикольная. Где такое достаёшь? Если в институте, то хороший у вас преподаватель
Не,я книжки сам читаю,это Страуструп,например.Кстати,был бы рад,если бы кто-нибудь навел меня на ответы к задачам,а то сверяться надо как-то,вас не мучать)
Evg
Эксперт CАвтор FAQ
17547 / 5785 / 370
Регистрация: 30.03.2009
Сообщений: 15,934
Записей в блоге: 26
09.06.2009, 21:56     Что делает данный код и зачем такое кому-нибудь может понадобиться? #20
Кстати, в той теме я так и не раскрыл принцип работы switch'а. Напишу тогда сейчас

Грубо говоря, во многих учебниках объясняется так, что код:

C
1
2
3
4
5
6
7
8
9
switch (x) 
{ 
  case 1: 
   statement1 
   break 
  case 2: 
   statement2 
   break 
}
эквивалентен коду

C
1
2
3
4
5
6
7
(if x == 1) 
{ 
  statement1 
} else if (x == 2) 
{ 
  statement2 
}
На самом деле это не так. Правильный эквивалент будет

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
(if x == 1) 
  goto L1; 
else if (x == 2) 
  goto L2; 
else 
  goto Finish; 
 
L1: 
  statement1 
  goto Finish; // инструкция break 
L2: 
  statement2 
  goto Finish; // инструкция break 
Finish:
Исходя из этого дальше сам соображай, как этот цикл работает
AzaKendler
214 / 116 / 9
Регистрация: 30.05.2011
Сообщений: 1,772
30.06.2011, 15:38     Что делает данный код и зачем такое кому-нибудь может понадобиться? #21
Evg, Евгений подскажите пожалуйста почему при (count%8)==4 я попадаю на метку 6:? при первом проходе.
ValeryLaptev
Эксперт С++
1039 / 818 / 48
Регистрация: 30.04.2011
Сообщений: 1,659
30.06.2011, 15:44     Что делает данный код и зачем такое кому-нибудь может понадобиться? #22
Цитата Сообщение от Evg Посмотреть сообщение
pragma, почитай тут, там я уже описывал семантику switch'а Проверьте себя. А хорошо ли вы знакомы со switch'ом?
А задачка и вправду прикольная. Где такое достаёшь? Если в институте, то хороший у вас преподаватель
Это из книги Страуструпа. Я б его на месте убил за такие конструкции... ))))
AzaKendler
214 / 116 / 9
Регистрация: 30.05.2011
Сообщений: 1,772
30.06.2011, 16:17     Что делает данный код и зачем такое кому-нибудь может понадобиться? #23
ValeryLaptev, Валерий, может вы подскажете?

Добавлено через 8 минут
все разобралсясорри

Добавлено через 7 минут
а где это можно применить? в книге вопрос по применению конструкции
ValeryLaptev
Эксперт С++
1039 / 818 / 48
Регистрация: 30.04.2011
Сообщений: 1,659
30.06.2011, 16:35     Что делает данный код и зачем такое кому-нибудь может понадобиться? #24
Цитата Сообщение от AzaKendler Посмотреть сообщение
ValeryLaptev, Валерий, может вы подскажете?

Добавлено через 8 минут
все разобралсясорри

Добавлено через 7 минут
а где это можно применить? в книге вопрос по применению конструкции
Не применяй. НИГДЕ. НИКОГДА. И пошли Страуструпа нафиг с подобными конструкциями.
Ибо главное качество программы - читабельность. А потом уже эффективность.
Что толку в эффективности, если читающий программист не может внести изменения, поскольку не понимает, как такое может работать. И при внесении изменений НЕИЗБЕЖНО возникают ошибки.
Поэтому - НАФИГ Страуструпа с подобными конструкциями!
Evg
Эксперт CАвтор FAQ
17547 / 5785 / 370
Регистрация: 30.03.2009
Сообщений: 15,934
Записей в блоге: 26
30.06.2011, 16:50     Что делает данный код и зачем такое кому-нибудь может понадобиться? #25
Цитата Сообщение от ValeryLaptev Посмотреть сообщение
Ибо главное качество программы - читабельность
Не всегда. Есть критичные к производительности куски программы. А потому писать их надо с приоритетом высокой производительности. А вместо читабельности писать развёрнутые комментарии. По современным меркам оптимизирующие компиляторы во многих случаях сделают качественный код независимо от того, какой из способов написания выбрал программист, но бывают случаи, когда компилятор не справляется с этой задачей. Или человек знает некоторые особенности, знания о которых нельзя дотащить до компилятора (пример с ходу привести не смогу).

Конкретно в случае с данным switch'ом код можно было бы разбить на два куска: preloop со switch'ом но без цикла и сам цикл. Код получился длиннее, но понятнее для людей. Да и наличие метки с переходом извне внутри цикла, постфактум на многих компиляторах приводит к тому, что компилятор отключает некоторые оптимизации (дабы не усложнять компилятор ради нескольких дебильных случаев).

Добавлено через 1 минуту
Цитата Сообщение от ValeryLaptev Посмотреть сообщение
Поэтому - НАФИГ Страуструпа с подобными конструкциями!
Это задание для учащихся. Причём задача "обратная": т.е. есть код, а надо разобраться, что он делает. Очень правильная постановка задачи. Преподавателям среднего и плохого уровня составлять подобные задания, как правило, не под силу
voral
428 / 408 / 57
Регистрация: 16.03.2008
Сообщений: 2,023
30.06.2011, 17:15     Что делает данный код и зачем такое кому-нибудь может понадобиться? #26
Блин ни как не могу раскурить вот этот кусок. (сократил лишнее)
Цитата Сообщение от #pragma Посмотреть сообщение
swith(count%8)
{
case 0: do { *to++=*from++;
case 7: *to++=*from++;
}while (--n>0)
}
Как этот do {} while работает. Когда начало в case 0........ Не как не укладывается в сознание
Jupiter
Каратель
Эксперт С++
6553 / 3973 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
30.06.2011, 17:19     Что делает данный код и зачем такое кому-нибудь может понадобиться? #27
voral, выполни трассировку, поймешь
voral
30.06.2011, 17:44
  #28

Не по теме:


Офигеть.
Век живи - век учись

Evg
Эксперт CАвтор FAQ
17547 / 5785 / 370
Регистрация: 30.03.2009
Сообщений: 15,934
Записей в блоге: 26
30.06.2011, 17:50     Что делает данный код и зачем такое кому-нибудь может понадобиться? #29
Цитата Сообщение от voral Посмотреть сообщение
Как этот do {} while работает. Когда начало в case 0........ Не как не укладывается в сознание
Неочевидные ответы на простые вопросы раздел 6
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
30.06.2011, 18:08     Что делает данный код и зачем такое кому-нибудь может понадобиться?
Еще ссылки по теме:
C++ Что делает данный цикл ?
Что делает данный цикл? C++
сегодня наконец то понял что такое КЛАСС, и ОБЪЕКТ. понято всё, кроме одного - зачем всё это? в смысле, можно же без этого? так зачем жизнь усложнять? C++
Что делает функция compare в коде и зачем она нужна в qsort C++
Что такое рекурсия? Зачем она нужна? C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
AzaKendler
214 / 116 / 9
Регистрация: 30.05.2011
Сообщений: 1,772
30.06.2011, 18:08     Что делает данный код и зачем такое кому-нибудь может понадобиться? #30
а в чем смысл того что начало расположено в 0:? если вынести do над 0: тоже работает. в чем особый смысл располагать так?
Yandex
Объявления
30.06.2011, 18:08     Что делает данный код и зачем такое кому-нибудь может понадобиться?
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru