|
|
  |
Длинные операнды, Выполняются с ошибками |
|
|
|
Apr 27 2009, 11:48
|

Местный
  
Группа: Свой
Сообщений: 331
Регистрация: 22-07-08
Из: Р О С С И Я
Пользователь №: 39 145

|
Доброго времени суток. GCC использую. Обнаружил, что операнд типа такого: Код a = a + (((b << 4) + rol (key[(sum % 4) + 4], b)) ^ (d + sum) ^ ((b >> 5) + rol (key[sum % 4], b >> 27))); #define rol(N, R) (N<<R)|(N>>(32-R)) выполняется с ошибками. Попытался разкидать это выражение по отдельным, всё стало вроде в норме. Может я чего-то недопонимаю. Откуда всё-таки ошибки? Спасибо!
|
|
|
|
|
Apr 27 2009, 11:56
|

Йа моск ;)
     
Группа: Модераторы
Сообщений: 4 345
Регистрация: 7-07-05
Из: Kharkiv-city
Пользователь №: 6 610

|
Цитата Наверное, с макросами внимательнее нужно быть: Тогда уже так: Код #define rol(N, R) (((N)<<(R))|((N)>>(32-(R)))) Кстати, надо бы сдвиг на правый заменить, он лучше ложится на архитектуру.
--------------------
"Практика выше (теоретического) познания, ибо она имеет не только достоинство всеобщности, но и непосредственной действительности." - В.И. Ленин
|
|
|
|
|
May 7 2009, 14:11
|

Местный
  
Группа: Участник
Сообщений: 219
Регистрация: 20-11-07
Пользователь №: 32 484

|
Цитата(Rst7 @ Apr 27 2009, 16:02)  А смысл? Дабы избежать удивительные эффекты от подстановки в качестве параметров макросов выражений. Цитата(Rst7 @ Apr 27 2009, 16:02)  Тогда еще надо и inline forced написать. Оставьте оптимизитору его работу.
|
|
|
|
|
May 7 2009, 16:32
|

Йа моск ;)
     
Группа: Модераторы
Сообщений: 4 345
Регистрация: 7-07-05
Из: Kharkiv-city
Пользователь №: 6 610

|
Цитата Дабы избежать удивительные эффекты от подстановки в качестве параметров макросов выражений. Этот вопрос решается скобками. Цитата Оставьте оптимизитору его работу. Да ну? Тут принципиально автору хочется строгого инлайна. Значит - надо писать, а не надеяться, что компиллер заинлайнит.
--------------------
"Практика выше (теоретического) познания, ибо она имеет не только достоинство всеобщности, но и непосредственной действительности." - В.И. Ленин
|
|
|
|
|
May 7 2009, 19:50
|

Местный
  
Группа: Участник
Сообщений: 219
Регистрация: 20-11-07
Пользователь №: 32 484

|
Цитата(Rst7 @ May 7 2009, 20:32)  Этот вопрос решается скобками. Код #define MAX(A, B) (((A) > (B)) ? (A) : (B))
int uberlongtimefunction(int x) { ... }
int main(void) { int a = 7; int b = 19; int m = MAX(++a, uberlongtimefunction(b)); }
Сообщение отредактировал meister - May 7 2009, 20:03
|
|
|
|
|
May 8 2009, 10:33
|
    
Группа: Свой
Сообщений: 1 928
Регистрация: 11-07-06
Пользователь №: 18 731

|
Цитата(meister @ May 7 2009, 23:50)  Код #define MAX(A, B) (((A) > (B)) ? (A) : (B)) ... int main(void) { int m = MAX(++a, uberlongtimefunction(b)); } О такой беде можно прочесть еще в первом издании Кернигана и Ричи. Если человеку приспичит походить по граблям с полированными ручками, его ни книжки, ни скобки не остановят. Rst7, имхо, говорил несколько о другом. А компиляторы под ПИК'и от ХТсофт, н-р, пользовательские функции инлайнить просто отказываются.
|
|
|
|
|
May 8 2009, 19:21
|

Йа моск ;)
     
Группа: Модераторы
Сообщений: 4 345
Регистрация: 7-07-05
Из: Kharkiv-city
Пользователь №: 6 610

|
Цитата Rst7, имхо, говорил несколько о другом. Безусловно. Для криптографии нужен строгий инлайн, иначе будет медленно. Вне зависимости от того, что решит компилятор - инлайнить или нет. Значит, нужна принудительная прагма. Так нафига столько лишней писанины? Цитата А компиляторы под ПИК'и от ХТсофт, н-р, пользовательские функции инлайнить просто отказываются. Разговор об ARM, если мне не изменяет память (по недавнему вопросу топикстартера в другой ветке). И о гнусе.
--------------------
"Практика выше (теоретического) познания, ибо она имеет не только достоинство всеобщности, но и непосредственной действительности." - В.И. Ленин
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|