Сейчас на форуме: bartolomeo (+6 невидимых)

 eXeL@B —› Программирование —› Вопрос по Си программированию
. 1 . 2 . 3 . 4 . >>
Посл.ответ Сообщение


Ранг: 793.4 (! !), 568thx
Активность: 0.740
Статус: Участник
Шаман

Создано: 28 ноября 2010 23:54 · Поправил: PE_Kill
· Личное сообщение · #1

Хех мои жалкие потуги. Буду тут флудить. Пытаюсь накодить функцию. Функция на вход получает контекст и данные, после чего распихивает эти данные в контекст. Собственно цель оптимизировать весь код эту и другие функции по размеру. Компилятор в релизе вырезает нахрен функцию и втыкает ее код прямо в основной код, как будто это макрос. Собственно вопрос, как ему сказать что мне это не нравится, но при этом оставить оптимизацию по размеру?

-----
Yann Tiersen best and do not fuck





Ранг: 1053.6 (!!!!), 1078thx
Активность: 1.060.81
Статус: Участник

Создано: 29 ноября 2010 00:29
· Личное сообщение · #2

какой компилятор? и как обьявлена функция?
попробуй убрать static с функции если он есть.




Ранг: 793.4 (! !), 568thx
Активность: 0.740
Статус: Участник
Шаман

Создано: 29 ноября 2010 00:38
· Личное сообщение · #3

MS VS 2010, сразу же и убрал и поставил назад статик, один фиг.

-----
Yann Tiersen best and do not fuck




Ранг: 512.7 (!), 360thx
Активность: 0.270.03
Статус: Модератор

Создано: 29 ноября 2010 01:14
· Личное сообщение · #4

PE_Kill
msdn.microsoft.com/en-us/library/k1ack8f1.aspx
/Ob может стоит пошуршать?




Ранг: 355.4 (мудрец), 55thx
Активность: 0.320
Статус: Uploader
5KRT

Создано: 29 ноября 2010 01:20
· Личное сообщение · #5

Или Intel C++ compiler попробовать

-----
Gutta cavat lapidem. Feci, quod potui. Faciant meliora potentes





Ранг: 527.7 (!), 381thx
Активность: 0.160.09
Статус: Участник
Победитель турнира 2010

Создано: 29 ноября 2010 01:21
· Личное сообщение · #6

в VS2010 не скажу, а в шестерке в установках проекта (оптимизация) есть опция

inline function expansion:
- disable
- only _inline
- any suitable

первые 2 опции должны решить проблему.

-----
127.0.0.1, sweet 127.0.0.1





Ранг: 67.4 (постоянный)
Активность: 0.040
Статус: Участник

Создано: 29 ноября 2010 01:39
· Личное сообщение · #7

Как вариант засунуть вызов функции с разных мест, которые никогда не будут вызваны, дурацкий костыль, но все же.



Ранг: 65.3 (постоянный), 10thx
Активность: 0.020
Статус: Участник

Создано: 29 ноября 2010 02:06
· Личное сообщение · #8

Может быть, глупость скажу, но может ее экспортировать? Либо совсем наружу, либо на уровне модуля, и тогда вырубить оптимизацию линкера?




Ранг: 793.4 (! !), 568thx
Активность: 0.740
Статус: Участник
Шаман

Создано: 29 ноября 2010 02:13
· Личное сообщение · #9

Sunzer пишет:
Как вариант засунуть вызов функции с разных мест, которые никогда не будут вызваны, дурацкий костыль, но все же.

Тогда умный компилятор просто грохает эти вызовы. Ладно вроде заработало. Теперь другой вопрос. Допустим я инициализирую некое поле структуры типа:

pStruct->Value = Data;

После этого мне нужно перевернуть значение в структуре. Как это сделать максимально коротко? Хотел сделать что то типа

_asm bswap pStruct->Value;

Но Си ругается. Как правильно?

-----
Yann Tiersen best and do not fuck




Ранг: 369.8 (мудрец), 400thx
Активность: 0.390
Статус: Участник

Создано: 29 ноября 2010 02:45
· Личное сообщение · #10

Не страдай фигней, а просто установи оптимизацию по размеру в настройках проекта, там же можно принудительно отключить все инлайны. Запретить инлайнить конкретную функцию можно указав перед ней __declspec(noinline)

PE_Kill пишет:
После этого мне нужно перевернуть значение в структуре. Как это сделать максимально коротко? Хотел сделать что то типа_asm bswap pStruct->Value;Но Си ругается. Как правильно?

За использование _asm без крайне веской причины надо отрубить руки. Я серьезно.
Используй интринсики _byteswap_ushort, _byteswap_ulong и _byteswap_uint64, для простоты и портабельности оберни их в макросы разворачивающие это в последовательность сдвигов - or'ов для компиляторов не поддерживающих интринсики.

-----
PGP key <0x1B6A24550F33E44A>





Ранг: 793.4 (! !), 568thx
Активность: 0.740
Статус: Участник
Шаман

Создано: 29 ноября 2010 02:49
· Личное сообщение · #11

Я так и сделал, но переворот 4 байтов Си превращает в портянку. Пытался через сдвиги сделать. Как заинлайнить bswap? Или как заставить Си повернуть байты коротко, не кучей shl и перекидыванием байтов из буфера в регистры и обратно.

-----
Yann Tiersen best and do not fuck




Ранг: 369.8 (мудрец), 400thx
Активность: 0.390
Статус: Участник

Создано: 29 ноября 2010 02:51
· Личное сообщение · #12

PE_Kill пишет:
Я так и сделал, но переворот 4 байтов Си превращает в портянку. Пытался через сдвиги сделать. Как заинлайнить bswap? Или как заставить Си повернуть байты коротко, не кучей shl и перекидыванием байтов из буфера в регистры и обратно.

Я уже сказал - юзай интринсики. Не нравится их вид в исходном коде - оборачивай в макросы.

-----
PGP key <0x1B6A24550F33E44A>





Ранг: 793.4 (! !), 568thx
Активность: 0.740
Статус: Участник
Шаман

Создано: 29 ноября 2010 02:51
· Личное сообщение · #13

Как заюзать _byteswap_xx? Си не знает такого.

-----
Yann Tiersen best and do not fuck




Ранг: 369.8 (мудрец), 400thx
Активность: 0.390
Статус: Участник

Создано: 29 ноября 2010 02:54
· Личное сообщение · #14

PE_Kill пишет:
Как заюзать _byteswap_xx? Си не знает такого.

Да, си не знает такого. Знают компиляторы msvc, icc и gcc, если ты юзаешь какой-то другой, то сделать можно только через сдвиги.

З.Ы. обзаведись msdn и заинклудь в своих сорцах intrin.h

-----
PGP key <0x1B6A24550F33E44A>





Ранг: 793.4 (! !), 568thx
Активность: 0.740
Статус: Участник
Шаман

Создано: 29 ноября 2010 02:55
· Личное сообщение · #15

Не, я мсдн глянул. Заинклудил <stdlib.h> как там сказано, получилось это:

Code:
  1. 00401133 >/$  8BFF          MOV EDI,EDI
  2. 00401135  |.  55            PUSH EBP
  3. 00401136  |.  8BEC          MOV EBP,ESP
  4. 00401138  |.  8B4D 08       MOV ECX,DWORD PTR SS:[EBP+8]
  5. 0040113B  |.  56            PUSH ESI
  6. 0040113C  |.  8BC1          MOV EAX,ECX
  7. 0040113E  |.  BA 00FF0000   MOV EDX,0FF00
  8. 00401143  |.  23C2          AND EAX,EDX
  9. 00401145  |.  8BF1          MOV ESI,ECX
  10. 00401147  |.  C1E6 10       SHL ESI,10
  11. 0040114A  |.  03C6          ADD EAX,ESI
  12. 0040114C  |.  8BF1          MOV ESI,ECX
  13. 0040114E  |.  C1EE 08       SHR ESI,8
  14. 00401151  |.  23F2          AND ESI,EDX
  15. 00401153  |.  C1E0 08       SHL EAX,8
  16. 00401156  |.  03C6          ADD EAX,ESI
  17. 00401158  |.  C1E9 18       SHR ECX,18
  18. 0040115B  |.  03C1          ADD EAX,ECX
  19. 0040115D  |.  5E            POP ESI
  20. 0040115E  |.  5D            POP EBP
  21. 0040115F  \.  C3            RETN


-----
Yann Tiersen best and do not fuck




Ранг: 369.8 (мудрец), 400thx
Активность: 0.390
Статус: Участник

Создано: 29 ноября 2010 02:56
· Личное сообщение · #16

Интринсики в настройках проекта включены? А то у меня почему-то получается что надо.

-----
PGP key <0x1B6A24550F33E44A>





Ранг: 1053.6 (!!!!), 1078thx
Активность: 1.060.81
Статус: Участник

Создано: 29 ноября 2010 03:06
· Личное сообщение · #17

для поворота можно еще пользоватся htons(), htonl(), ntohs(), ntohl()
но они ограничены в 16 и 32 бита
но если заинлайнятся
то будет как раз тот же rol или bswap
смотря как реализован

можно конечно их и в ручную вытянуть себе в .h, как инлайн




Ранг: 793.4 (! !), 568thx
Активность: 0.740
Статус: Участник
Шаман

Создано: 29 ноября 2010 03:10 · Поправил: PE_Kill
· Личное сообщение · #18

ntldr пишет:
Интринсики в настройках проекта включены?

Это где про SIMD расширение? Включил вообще перестало свапиться, как будто нет этой строчки в исходнике. Отключаю свапится через портянку сдвигов.

Обалдеть, я уже час пытаюсь 4 байта в си перевернуть. ntldr вот об это я и говорил в топе стилф дбг.

-----
Yann Tiersen best and do not fuck




Ранг: 369.8 (мудрец), 400thx
Активность: 0.390
Статус: Участник

Создано: 29 ноября 2010 03:14
· Личное сообщение · #19

Это "Enable Intrinsic Functions" на вкладке "C/C++->Optimization".

-----
PGP key <0x1B6A24550F33E44A>




Ранг: 35.0 (посетитель), 11thx
Активность: 0.030
Статус: Участник

Создано: 29 ноября 2010 03:17 · Поправил: sniper
· Личное сообщение · #20

PE_Kill пишет:
Собственно вопрос, как ему сказать что мне это не нравится, но при этом оставить оптимизацию по размеру?

/GL-, во вкладке оптимизации..



Ранг: 35.0 (посетитель), 11thx
Активность: 0.030
Статус: Участник

Создано: 29 ноября 2010 03:27 · Поправил: sniper
· Личное сообщение · #21

ntldr
http://msdn.microsoft.com/en-us/library/a3140177(VS.80).aspx - <stdlib.h> нужен

PE_Kill
кодес:
Code:
  1. #include <stdlib.h>
  2. #include <stdio.h>
  3.  
  4. int main()
  5. {
  6.     unsigned long x = _byteswap_ulong(0x12345678);
  7.  
  8.     printf("%x", x);
  9. }


получаем:
Code:
  1. 00401000   mov eax,12345678
  2. 00401005   bswap eax
  3. 00401007   push eax                              ; /<%x>
  4. 00401008   push xxx.004020EC                     ; |format = "%x"
  5. 0040100D   call [<&MSVCR90.printf>]              ; \printf
  6. 00401013   pop ecx
  7. 00401014   pop ecx
  8. 00401015   xor eax,eax
  9. 00401017   retn


VS2008, оптимизация по размеру..




Ранг: 793.4 (! !), 568thx
Активность: 0.740
Статус: Участник
Шаман

Создано: 29 ноября 2010 03:31 · Поправил: PE_Kill
· Личное сообщение · #22

Заработало! Ура! Я научился генерить bswap! До завтра...

-----
Yann Tiersen best and do not fuck




Ранг: 369.8 (мудрец), 400thx
Активность: 0.390
Статус: Участник

Создано: 29 ноября 2010 03:37
· Личное сообщение · #23

sniper
Вообще-то все интринсики можно подключить через intrin.h, stdlib нужен если нужна сборка с отключенной поддержкой интринсиков.

PE_Kill пишет:
Включены подстановки, вообще нет свапа.

Код в студию, ибо это или чьи-то руки, или огромный баг компилятора.

-----
PGP key <0x1B6A24550F33E44A>




Ранг: 35.0 (посетитель), 11thx
Активность: 0.030
Статус: Участник

Создано: 29 ноября 2010 03:43 · Поправил: sniper
· Личное сообщение · #24

ntldr
да, точно, хотя всё равно разницы нет. я просто сначала _byteswap_xxx не нашел в intrin.h.. хуле, спать нужно идти уже )

PE_Kill
заметь как msvc оптимизировал код. после call printf вместо add esp, 8 сделал pop ecx pop ecx, т.е. экономия целый байт кода..




Ранг: 793.4 (! !), 568thx
Активность: 0.740
Статус: Участник
Шаман

Создано: 29 ноября 2010 10:20 · Поправил: PE_Kill
· Личное сообщение · #25

ntldr пишет:
ибо это или чьи-то руки, или огромный баг компилятора

Ага это руки, надо было сразу бросить и поспать, пытался заюзать эту функцию как процедуру.

sniper пишет:
заметь как msvc оптимизировал код

Ага я уже свой алгос потестил, просто писаю кипятком. Как будто протектор какой то ковыряю, такие финты...

Вот например инициализация структуры:
Code:
  1. 00401176    C683 B0568C00 00   MOV BYTE PTR DS:[EBX+8C56B0],0
  2. 0040117D    6A 10              PUSH 10
  3. 0040117F    8DBB DC568C00      LEA EDI,DWORD PTR DS:[EBX+8C56DC]
  4. 00401185    58                 POP EAX
  5. 00401186    AB                 STOS DWORD PTR ES:[EDI]
  6. 00401187    AB                 STOS DWORD PTR ES:[EDI]
  7. 00401188    AB                 STOS DWORD PTR ES:[EDI]
  8. 00401189    AB                 STOS DWORD PTR ES:[EDI]


PS Запустил на другом компе, ругается

Приложению не удалось запуститься, поскольку MSVCR100.dll не был найден. Повторная установка приложения может исправить эту проблему.

Как бы компилить так, чтобы обычные библиотеки использовались, которые есть во всех виндах, проект то 50 строчек работы со структурами апи вообще не юзаются, нафига оно такое собирает?

-----
Yann Tiersen best and do not fuck




Ранг: 516.1 (!), 39thx
Активность: 0.280
Статус: Участник

Создано: 29 ноября 2010 10:27
· Личное сообщение · #26

авось пригодится, x - 32 бита

#define ROR(x,n) (((x) >> (n)) | ((x) << (32-(n))))

#define ROL(x,n) (((x) << (n)) | ((x) >> (32-(n))))

#define BSWAP(x) (((x) >> 24) | (((x) & 0x00FF0000) >> 8) | (((x) & 0x0000FF00) << 8) | ((x) << 24))



Ранг: 516.1 (!), 39thx
Активность: 0.280
Статус: Участник

Создано: 29 ноября 2010 10:30 · Поправил: Av0id
· Личное сообщение · #27

MSVCR100.DLL

тут выход один или ставить где нужно vcredist от 2010 студии или юзать студии, для которых не нужно ставить редист, например 2003, вот так витиевато



Ранг: 369.8 (мудрец), 400thx
Активность: 0.390
Статус: Участник

Создано: 29 ноября 2010 10:45
· Личное сообщение · #28

PE_Kill пишет:
Как бы компилить так, чтобы обычные библиотеки использовались

Линковать с msvcrt.lib из аттача, отключить "Buffer Security Check" и отключить генерацию манифеста. И сразу забыть про использование MFC и других приплюснутых библиотек. Либо просто-напросто включить статический CRT, получить большой екзешник но без проблем.

З.Ы. не рекомендую так делать без нужды, ибо функциональность новой CRT лучше, и может сэкономить кучу времени и нервов.

7704_28.11.2010_CRACKLAB.rU.tgz - msvcrt.lib

-----
PGP key <0x1B6A24550F33E44A>




Ранг: 481.4 (мудрец), 109thx
Активность: 0.180
Статус: Участник
Тот самый :)

Создано: 29 ноября 2010 17:29 · Поправил: Hexxx
· Личное сообщение · #29

Av0id пишет:
юзать студии, для которых не нужно ставить редист



PE_Kill пишет:
нафига оно такое собирает?

Потому что в "С/C++" - "Сode Generation" стоит single(multi)threaded DLL.

-----
Реверсивная инженерия - написание кода идентичного натуральному




Ранг: 35.0 (посетитель), 11thx
Активность: 0.030
Статус: Участник

Создано: 29 ноября 2010 18:24
· Личное сообщение · #30

PE_Kill пишет:
Ага я уже свой алгос потестил, просто писаю кипятком. Как будто протектор какой то ковыряю, такие финты...

дану, залей файл, никогда не видел такого изврата. код msvc намного более читабельный и понятный, чем, например, того же делфе


. 1 . 2 . 3 . 4 . >>
 eXeL@B —› Программирование —› Вопрос по Си программированию
:: Ваш ответ
Жирный  Курсив  Подчеркнутый  Перечеркнутый  {mpf5}  Код  Вставить ссылку 
:s1: :s2: :s3: :s4: :s5: :s6: :s7: :s8: :s9: :s10: :s11: :s12: :s13: :s14: :s15: :s16:


Максимальный размер аттача: 500KB.
Ваш логин: german1505 » Выход » ЛС
   Для печати Для печати