Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« : 07-04-2008 07:53 » |
|
я, кстати, для обработки соседних клеток во всех похожих задачах таже предпочитаю 8 строк ) Они даже красивее цикла смотрятся, а что работают быстрее - это как-то само понятно )
|
|
|
Записан
|
|
|
|
Гром
Птычк. Тьфу, птычник... Вот!
Готовлюсь к пенсии
Offline
Пол:
Бодрый птах
|
|
« Ответ #1 : 07-04-2008 14:38 » |
|
Леш - не совсем само собой. Тут сегодня зависит от компилятора. Нормальный должен при коротких циклах сам раскладывать из цикла в строки с фиксированными индексами, просто раньше это не работало. Особенно в турбо бейсике А на С++ сегодня в gcc++ можешь проверить сам раскладку. Все циклы до 10 с несложным вложением будут выданы в асемблере как последовательные команды. Скорость кстати повышается именно из за отсутствия лишней опреации привсаивания и отсутствия условных переходв (jump-ов).
|
|
|
Записан
|
А птичку нашу прошу не обижать!!!
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #2 : 07-04-2008 15:05 » |
|
Гром, ну ты не прав. Когда надо смотреть в 8 сторон, там ни о какой упорядоченности индексов (двух!) не идёт. Твоя просьба вот: int i; int x; int z;
for(i=0;i<5;i++) { x=x+z; }
результат 76: int i; 77: int x; 78: int z; 79: 80: for(i=0;i<5;i++) 004045CC mov dword ptr [ebp-14h],0 004045D3 jmp CReversi2View::CReversi2View+0BEh (004045de) 004045D5 mov ecx,dword ptr [ebp-14h] 004045D8 add ecx,1 004045DB mov dword ptr [ebp-14h],ecx 004045DE cmp dword ptr [ebp-14h],5 004045E2 jge CReversi2View::CReversi2View+0CFh (004045ef) 81: { 82: x=x+z; 004045E4 mov edx,dword ptr [ebp-18h] 004045E7 add edx,dword ptr [ebp-1Ch] 004045EA mov dword ptr [ebp-18h],edx 83: } 004045ED jmp CReversi2View::CReversi2View+0B5h (004045d5) 84: .... .... .... 154: ... 004045EF ... 004045F2 ...
|
|
|
Записан
|
|
|
|
Антон (LogRus)
|
|
« Ответ #3 : 08-04-2008 04:06 » |
|
Алексей1153++, студия схавала код за будь здоров даже на строки не стала раскладывать тупо результат подставила, подстчитанный на этапе компиляции вот: void f() { int x = 1; int z = 2;
for(int i = 0; i != 5 ; ++i) { x=x+z; } std::cout << x; }
void f2() { int i; int x = 1; int z = 2;
for(i = 0; i < 5 ; i++) { x=x+z; } std::cout << x; }
void f3(int x, int z) { for(int i = 0; i != 5 ; ++i) { x=x+z; } std::cout << x; }
template <int c> int f4(int x, int z);
template <> int f4<0>(int x, int z) { return x; }
template <int c> int f4(int x, int z) { return z + f4<c-1>(x, z); }
int _tmain(int argc, _TCHAR* argv[]) {
f(); 004014B0 push 0Bh 004014B2 mov ecx,offset std::cout (4151F0h) 004014B7 call std::basic_ostream<char,std::char_traits<char> >::operator<< (401320h) f2(); 004014BC push 0Bh 004014BE mov ecx,offset std::cout (4151F0h) 004014C3 call std::basic_ostream<char,std::char_traits<char> >::operator<< (401320h) f3(1, 2); 004014C8 push 0Bh 004014CA mov ecx,offset std::cout (4151F0h) 004014CF call std::basic_ostream<char,std::char_traits<char> >::operator<< (401320h) f3(1, 4); 004014D4 push 15h 004014D6 mov ecx,offset std::cout (4151F0h) 004014DB call std::basic_ostream<char,std::char_traits<char> >::operator<< (401320h) std::cout << f4<5>(1,2); 004014E0 push 0Bh 004014E2 mov ecx,offset std::cout (4151F0h) 004014E7 call std::basic_ostream<char,std::char_traits<char> >::operator<< (401320h)
return 0; 004014EC xor eax,eax } 004014EE ret
gcc тоже повыкидывал циклы, но не стал делать инлайнинг функций(и это правильно, т.к. функции могут быть использованы из внешнего cpp) и еще пара различий есть, это с опцией -g, а что он делает без этой опции ваще не понял, вроде видны вызовы функций в ассемблерном коде, но он на них не прыгает, а почти сразу выходит после вызова f1 может внутрях, где чего еще спрятал. но это уже оффтоп
|
|
« Последнее редактирование: 08-04-2008 04:33 от LogRus »
|
Записан
|
Странно всё это....
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #4 : 08-04-2008 04:17 » |
|
LogRus, а у меня не студия что ли ? )
а если ты их в качестве параметров передашь ? А не инициализируешь константами
|
|
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #5 : 08-04-2008 04:32 » |
|
вот это номер )) Что за тоска ? Профессия для всех!
|
|
|
Записан
|
|
|
|
Антон (LogRus)
|
|
« Ответ #6 : 08-04-2008 04:35 » |
|
Алексей1153++, весь код программы привёл, VS.NET 2003 собирал Release с /O2
|
|
|
Записан
|
Странно всё это....
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #7 : 08-04-2008 04:46 » |
|
LogRus, где весь код, вот для вот этого ассемблер покажи void f3(int x, int z) { for(int i = 0; i != 5 ; ++i) { x=x+z; } }
|
|
|
Записан
|
|
|
|
marat_
Шеф-повар
Опытный
Offline
|
|
« Ответ #8 : 08-04-2008 04:52 » |
|
нет. мужчина должен материальное в мир приносить, творить, создавать то, чем потомки смогут гордиться. а программы - ерунда, трата времени и сил. ничего нет недолговечнее кода, ну разве что обещания вечной любви.
|
|
|
Записан
|
|
|
|
Антон (LogRus)
|
|
« Ответ #9 : 08-04-2008 05:12 » |
|
LogRus, где весь код, вот для вот этого ассемблер покажи void f3(int x, int z) { for(int i = 0; i != 5 ; ++i) { x=x+z; } }
Внимательней, читай f3(1, 2); 004014C8 push 0Bh 004014CA mov ecx,offset std::cout (4151F0h) 004014CF call std::basic_ostream<char,std::char_traits<char> >::operator<< (401320h)
|
|
|
Записан
|
Странно всё это....
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #10 : 08-04-2008 05:36 » |
|
Логрус, да передай ты уже туда переменные, а не константы )) Шутю. marat_, а деньги мужчина в сембю должен приносить ? На вечном/для потомков - денег не заработаешь. Да и нужны людям наши программы, например для охраны жилищ и магазинов, чтоп не разворовали всё до потомков
|
|
|
Записан
|
|
|
|
Гром
Птычк. Тьфу, птычник... Вот!
Готовлюсь к пенсии
Offline
Пол:
Бодрый птах
|
|
« Ответ #11 : 08-04-2008 06:48 » |
|
Леш, ты что-то косячишь с оптимизайией. Вот. Кстати - 8 сторон очень даже упорядочиваются И плюс ко всему - jump сам по себе операция по тяжелее чем переход на след. строку.
|
|
|
Записан
|
А птичку нашу прошу не обижать!!!
|
|
|
Вад
|
|
« Ответ #12 : 08-04-2008 07:02 » |
|
Гром, может, дело в версии компилятора? Алексей1153++, если правильно помню, у тебя ведь в основном VS 6.0 используется? Offtopic: Может, тему про оптимизацию отделить и перекинуть в раздел C++? Поставлю в угол.
|
|
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #13 : 08-04-2008 07:11 » |
|
я с оптимизацией не косячу )) Я вообще не прикасался к ней )) Всё по умолчанию в настройках . Ага, VC++6
|
|
|
Записан
|
|
|
|
|