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

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

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 22, средняя оценка - 4.68
Max777
0 / 0 / 0
Регистрация: 12.09.2009
Сообщений: 31
#1

создание функции - C++

08.10.2009, 14:45. Просмотров 2630. Ответов 17

помогите описать функцию меняющую местами максимальные элементы матриц А и В произвольного порядка.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
M128K145
Эксперт C++
 Аватар для M128K145
8277 / 3496 / 143
Регистрация: 03.07.2009
Сообщений: 10,707
08.10.2009, 15:30     создание функции #2
допустим максимальный элемент матрицы A[169][164] и матрицы B[1055][6216]
Обмен будет таким
C++
1
A[169][164] ^= B[1055][6216] ^= A[169][164] ^= B[1055][6216];
В функцию передаешь 6 параметров - указатели на матрицы и 4 параметра размерностей матриц
Somebody
2775 / 1589 / 142
Регистрация: 03.12.2007
Сообщений: 4,162
Завершенные тесты: 1
08.10.2009, 16:10     создание функции #3
Цитата Сообщение от M128K145 Посмотреть сообщение
A[169][164] ^= B[1055][6216] ^= A[169][164] ^= B[1055][6216];
Нельзя так - A[169][164] изменяется дважды до следующей sequence point.
M128K145
Эксперт C++
 Аватар для M128K145
8277 / 3496 / 143
Регистрация: 03.07.2009
Сообщений: 10,707
08.10.2009, 16:15     создание функции #4
Somebody, я понимаю, но в С и С++ работает. Это вот в C#, Java и J# убрали такую возможность
Somebody
2775 / 1589 / 142
Регистрация: 03.12.2007
Сообщений: 4,162
Завершенные тесты: 1
08.10.2009, 16:21     создание функции #5
Цитата Сообщение от M128K145 Посмотреть сообщение
Somebody, я понимаю, но в С и С++ работает. Это вот в C#, Java и J# убрали такую возможность
Это по сути из разряда i=i++, что в i? Возьмёт и заработает не так с каким-нибудь компилятором.
.::.DIMA.::.
142 / 142 / 4
Регистрация: 26.10.2008
Сообщений: 782
08.10.2009, 16:23     создание функции #6
Цитата Сообщение от Somebody Посмотреть сообщение
Нельзя так - A[169][164] изменяется дважды до следующей sequence point.
А что это занчит?
M128K145
Эксперт C++
 Аватар для M128K145
8277 / 3496 / 143
Регистрация: 03.07.2009
Сообщений: 10,707
08.10.2009, 16:43     создание функции #7
Somebody, проверено на Dev-C++, MSVS 6.0/2003/2005/2008/2010, BC 3.1/6.0. Мне кажется, вероятность такого события стремится к 0 или компилятор какой-то ручной сборки. Хотя возможно ты и прав, gcc на такое способен, утверждать не буду.
TanT
эволюционирую потихоньку
 Аватар для TanT
464 / 462 / 43
Регистрация: 30.06.2009
Сообщений: 1,399
08.10.2009, 17:05     создание функции #8
Цитата Сообщение от M128K145 Посмотреть сообщение
допустим максимальный элемент матрицы A[169][164] и матрицы B[1055][6216]
Обмен будет таким
C++
1
A[169][164] ^= B[1055][6216] ^= A[169][164] ^= B[1055][6216];
В функцию передаешь 6 параметров - указатели на матрицы и 4 параметра размерностей матриц
здорово, сами придумали или из какой-нить литературы? возьму на заметку.
по затратам тактов есть информация для этого трюка. в плане, что быстрее стандартно поменять две перменные местами, используя буферную третью или вот таким способом? и на сколько?
kravam
быдлокодер
 Аватар для kravam
1513 / 873 / 44
Регистрация: 04.06.2008
Сообщений: 5,304
08.10.2009, 17:49     создание функции #9
Вот инструкции процессора для первого способа первый
00401414 |. 8B45 FC MOV EAX,DWORD PTR SS:[EBP-4]
00401417 |. 8945 F4 MOV DWORD PTR SS:[EBP-C],EAX
0040141A |. 8B45 F8 MOV EAX,DWORD PTR SS:[EBP-8]
0040141D |. 8945 FC MOV DWORD PTR SS:[EBP-4],EAX
00401420 |. 8B45 F4 MOV EAX,DWORD PTR SS:[EBP-C]
00401423 |. 8945 F8 MOV DWORD PTR SS:[EBP-8],EAX


А вот для второго.
00401414 |. 8B55 F8 MOV EDX,DWORD PTR SS:[EBP-8]
00401417 |. 8D45 FC LEA EAX,DWORD PTR SS:[EBP-4]
0040141A |. 3110 XOR DWORD PTR DS:[EAX],EDX
0040141C |. 8B55 FC MOV EDX,DWORD PTR SS:[EBP-4]
0040141F |. 8D45 F8 LEA EAX,DWORD PTR SS:[EBP-8]
00401422 |. 3110 XOR DWORD PTR DS:[EAX],EDX
00401424 |. 8B55 F8 MOV EDX,DWORD PTR SS:[EBP-8]
00401427 |. 8D45 FC LEA EAX,DWORD PTR SS:[EBP-4]
0040142A |. 3110 XOR DWORD PTR DS:[EAX],EDX

Видно, что второй способ пусть ненамного, но дольше.
Действительно, при использовании дополнительной переменной переменной получается
1) Кладём переменную в регистр
2) Меняем
И так 3 раза, итого 6 инструкций

Во втором способе
1) Кладём переменную в регистр
2) Кладём адрес второй переменной в региср
3) Побитовая команда XOR
И так 3 раза.
Всего 9 команд
TanT
эволюционирую потихоньку
 Аватар для TanT
464 / 462 / 43
Регистрация: 30.06.2009
Сообщений: 1,399
08.10.2009, 19:37     создание функции #10
всегда либо производительность, либо объём используемой памяти
однако, все используемые в данных преобразованиях команды процессора выполняются за одинаковое количество тактов?

ещё к примеру ускорения работы
for(i=N; --i>=0
выполняется быстрее чем
for(i=0; i<N; i++) из-за сравнения в первом случае перменной с нулём, а не с N. Проявляется хорошо при больших N.

и второй вопрос, 1 час назад поставил наконец вижуал 2008, где в нём можно нструкции процессора посмотреть?
M128K145
Эксперт C++
 Аватар для M128K145
8277 / 3496 / 143
Регистрация: 03.07.2009
Сообщений: 10,707
08.10.2009, 19:57     создание функции #11
Цитата Сообщение от TanT Посмотреть сообщение
1 час назад поставил наконец вижуал 2008, где в нём можно нструкции процессора посмотреть?
ставишь брейкпоинт - вроде F9. Потом при запуске когда доходит до метки правой кнопкой - Go To Disassembly или как-то так
TanT
эволюционирую потихоньку
 Аватар для TanT
464 / 462 / 43
Регистрация: 30.06.2009
Сообщений: 1,399
08.10.2009, 20:05     создание функции #12
Цитата Сообщение от M128K145 Посмотреть сообщение
ставишь брейкпоинт - вроде F9. Потом при запуске когда доходит до метки правой кнопкой - Go To Disassembly или как-то так
не совсем то мне бы хотелось. некоторые программные продукты (скажем IAR) позволяют выводить в фаил полную расшифровку кода с комментариями и объёмом используемых ресурсов как каждой отдельной функцией, так и всем кодом. очень удобно при отладке, сразу видно где неоптимально реализованно чего-нить.
Хотелось бы узнать есть такая возможность в вижуале и где?

давно интересно, а спросить стеснялся
Max777
0 / 0 / 0
Регистрация: 12.09.2009
Сообщений: 31
10.10.2009, 14:57  [ТС]     создание функции #13
есть ещё у кого нибудь версии как это сделать?
CheshireCat
Эксперт С++
2910 / 1238 / 78
Регистрация: 27.05.2008
Сообщений: 3,321
10.10.2009, 17:03     создание функции #14
Цитата Сообщение от kravam Посмотреть сообщение
Видно, что второй способ пусть ненамного, но дольше. [....]
И так 3 раза, итого 6 инструкций [.....]
И так 3 раза. Всего 9 команд
К сожалению, это заблуждение. Современные процессоры имеют два конвейера выполнения и скорость исполнения кода определяется не только числом инструкций, но и возможностью их распараллеливания (спаривания, pairing) в конвейерах.
Конкретно для твоего примера, обе последовательности инструкций выполняются за 6 тактов (инструкции MOV и LEA во втором варианте кода независимы и поэтому выполняются за 1 такт в конвейерах U и V). Первый же вариант кода по Стандарту языка является, кроме того, и небезопасным, порождая Undefined behavior. И то, что наблюдаемые эффекты от этого UB совпадают с "желаемыми" - ничего не значит. Это просто чистое везение. Неизвестно, что произойдет при переносе кода на другой компилятор (например, через N лет на какой-нибудь VC++ 2020 ).

Добавлено через 18 минут
PS: вот любопытства для прогнал тестовую программу под Intel VTune Perfomance Analyzer. Компилятор MSVC++ 2005, Release, оптимизация по скорости выполнения. Результаты:
C++
1
2
3
4
5
6
7
8
9
10
{
    a ^= b ^= a ^= b;   // 819 попугаев
}
// ......
{
    int temp = a;       // 216
    a = b;              // 317 
    b = temp;           // 227
                        // итого: 760 попугаев
}
TanT
эволюционирую потихоньку
 Аватар для TanT
464 / 462 / 43
Регистрация: 30.06.2009
Сообщений: 1,399
11.10.2009, 09:25     создание функции #15
Цитата Сообщение от CheshireCat Посмотреть сообщение
Первый же вариант кода по Стандарту языка является, кроме того, и небезопасным, порождая Undefined behavior.
чтобы окончательно просветить этот вопрос: первый вариант это
C++
1
2
3
int temp = a;       // 216
    a = b;              // 317 
    b = temp;           // 227
?
отталкиваюсь от
Действительно, при использовании дополнительной переменной переменной получается
1) Кладём переменную в регистр
2) Меняем
И так 3 раза, итого 6 инструкций

Во втором способе
1) Кладём переменную в регистр
2) Кладём адрес второй переменной в региср
3) Побитовая команда XOR
И так 3 раза.
Всего 9 команд
P.S. подпопугаями подразумевается числовое значение, хранящееся в переменной, или иное?
CheshireCat
Эксперт С++
2910 / 1238 / 78
Регистрация: 27.05.2008
Сообщений: 3,321
11.10.2009, 10:37     создание функции #16
Нет, первый вариант - имелась в виду куча XOR'ов (я, похоже, где-то тут запутался....? ):
C++
1
a ^= b ^= a ^= b;
Что касается попугаев - то это показание счетчика Intel VTune Perfomance Analyzer, относящееся к данной строке. В тесте этот код прогонялся в цикле. Чем больше попугаев - тем больше времени намерил VTune и тем дольше будет выполняться код в реальных условиях. Правда, я пока не задавался вопросом, почему получены именно такие цифры, это потребует micro code optimization этапа анализа в VTune.
Somebody
2775 / 1589 / 142
Регистрация: 03.12.2007
Сообщений: 4,162
Завершенные тесты: 1
11.10.2009, 13:07     создание функции #17
Цитата Сообщение от CheshireCat Посмотреть сообщение
К сожалению, это заблуждение. Современные процессоры имеют два конвейера выполнения и скорость исполнения кода определяется не только числом инструкций, но и возможностью их распараллеливания (спаривания, pairing) в конвейерах. Конкретно для твоего примера, обе последовательности инструкций выполняются за 6 тактов (инструкции MOV и LEA во втором варианте кода независимы и поэтому выполняются за 1 такт в конвейерах U и V).
Если не ошибаюсь, два конвейера (U и V) были очень-очень давно, а уже начиная с Pentium Pro всё намного сложнее.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
12.10.2009, 20:22     создание функции
Еще ссылки по теме:

создание функции в С++ C++
создание функции C++
C++ Создание своей функции
C++ Создание собственной функции
Создание шаблона функции C++

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

Или воспользуйтесь поиском по форуму:
Max777
0 / 0 / 0
Регистрация: 12.09.2009
Сообщений: 31
12.10.2009, 20:22  [ТС]     создание функции #18
опишити ещё по подробней суть моей проблемы пожалста)))))

???
Yandex
Объявления
12.10.2009, 20:22     создание функции
Ответ Создать тему
Опции темы

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