eXeL@B —› Программирование —› Генерируемый компиляторами код. |
Посл.ответ | Сообщение |
|
Создано: 05 июля 2012 20:50 · Поправил: neomant · Личное сообщение · #1 Часто сталкиваюсь с подобным кодом: Code:
Не придавал этому раньше значения. Все же не оптимальнее было бы генерировать одну арифметическую инструкцию вместо двух или здесь есть какой-то скрытый умысел? ----- Следуй за белым кроликом |
|
Создано: 05 июля 2012 20:53 · Поправил: reversecode · Личное сообщение · #2 |
|
Создано: 05 июля 2012 22:35 · Личное сообщение · #3 neomant Это обычный (не табличный switch), такой код компилятор генерит когда расстояние между некоторыми соседними case больше определенной величины, а другие последовательные case идут более часто. Компилятор таким образом разбивает весь switch на блоки, где add eax, -52 одно из межблочных расстояний. ----- Everything is relative... |
|
Создано: 05 июля 2012 22:50 · Личное сообщение · #4 |
|
Создано: 05 июля 2012 23:42 · Поправил: reversecode · Личное сообщение · #5 neomant пишет: Да, оптимизированный до неузнаваемости switch у меня есть два файла скомпилированых gcc разных версий ранняя версия скомпилировала со switch, а позняя уже заоптимизировала в if else в хексрее это кошманый стоетажный домик neomant пишет: Так значит особого смысла в паре инструкций add eax, -52, sub eax, 2 нет и можно их считать одной операцией? смысла нет, можно считать |
|
Создано: 06 июля 2012 00:35 · Личное сообщение · #6 reversecode пишет: у меня есть два файла скомпилированых gcc разных версий Только что собрал семпл на 4.6 Code:
Без оптимизации, а с оптимизацией эта сволочь выкидывала switch. Code:
|
|
Создано: 06 июля 2012 10:18 · Поправил: neomant · Личное сообщение · #7 |
|
Создано: 06 июля 2012 10:45 · Личное сообщение · #8 |
eXeL@B —› Программирование —› Генерируемый компиляторами код. |