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

 eXeL@B —› Программирование —› Инкременты
Посл.ответ Сообщение

Ранг: 5.5 (гость)
Активность: 0=0
Статус: Участник

Создано: 02 апреля 2011 15:59
· Личное сообщение · #1

Всем привет, с помощью ida pro изучаю поведение компилятора Visual Studio 2010 (дизассемблирую объектные файлы) , в частности интересовал вопрос: что быстрее и есть ли вообще разница в машинном представлении следующих комманд на языке C++ для целочисленных переменных типа int
1)i++;
2)++i;
3)i = i + 1;

IDA выдала одинаковый результат для всех трех случаев:

mov [ebp+var_8], eax ;
mov eax, [ebp+var_8]
add eax, 1

Получается, можно сделать вывод, что нет разницы?
зависит ли результат от типа компилятора?
спасибо большое!

Решил попробовать написать свою собственную статью)




Ранг: 2014.5 (!!!!), 1278thx
Активность: 1.340.25
Статус: Модератор
retired

Создано: 02 апреля 2011 16:12
· Личное сообщение · #2

Для обычного инта разница будет вряд ли.
Для других типов, особенно сложных, разница может быть очень даже.




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

Создано: 02 апреля 2011 16:18
· Личное сообщение · #3

Alexcnt
включите не дебаг, а релиз
я вас уверяю они отличаются
если будут одинаковые
попробуйте другую студию
и так же проверте в gcc



Ранг: 114.8 (ветеран), 41thx
Активность: 0.10
Статус: Участник

Создано: 02 апреля 2011 18:37 · Поправил: _ruzmaz_
· Личное сообщение · #4

разница между вариантами 1 и 2 не в том, что делается с i и как, а в том, когда (перед или после вычисления значения выражения, в котором используется переменная, к которой в пределах этого выражения применен оператор инкремента)
следовательно, если выражение состоит лишь из переменной с примененным к ней оператором инкремента (как в вариантах 1 и 2), то разницы между вариантами 1 и 2 быть не должно



Ранг: 23.5 (новичок), 5thx
Активность: 0.020
Статус: Участник

Создано: 02 апреля 2011 19:34
· Личное сообщение · #5

Alexcnt пишет:
зависит ли результат от типа компилятора?


в принцыпе, да, зависит
но больше зависит от уровня оптимизации



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

Создано: 02 апреля 2011 19:54
· Личное сообщение · #6

Как написано в FAQ по C++, для int разницы не будет. Впрочем, это неудивительно. Я думаю, для всех встроенных типов это верно.
От компилятора может зависеть все, что угодно. Есть компиляторы, не соответствующие стандарту. Можно написать компилятор, который будет гарантировать, что i++ выполняется дольше, чем ++i.
Вот ЧаВо по С++:
http://www.parashift.com/c++-faq-lite/index.html




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

Создано: 02 апреля 2011 20:08
· Личное сообщение · #7

они сущетсвенно отличаются
но оптимизация всегда по разному срабатывает
в большинстве случаев
i++; работает через регистр mov eax, var; add eax,1; mov var,eax
++i; очень часто встречается как inc var;



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

Создано: 02 апреля 2011 21:45
· Личное сообщение · #8

Про сложные типы уже упомянули. Вставлю свои 5 коп.
Типовая реализация i++ выглядит как
{
T r = i; ++i; return r;
}
Соответственно, ++i будет в большинстве случаев либо такое же, либо быстрее i++.

-----
старый пень




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

Создано: 02 апреля 2011 21:58
· Личное сообщение · #9

Вопрос для собеседования на вакансию C/C++-программиста:
int i = 5, j = i++ + ++i; – чему равно i и j?



Ранг: 5.5 (гость)
Активность: 0=0
Статус: Участник

Создано: 02 апреля 2011 22:11
· Личное сообщение · #10

sendersu
Такое ощущение, что я для Вас писал свою первую статью в ЖЖ (я новичок))
Там можете прочитать о результатах подобных выражений на других языках программирования)



Ранг: 5.5 (гость)
Активность: 0=0
Статус: Участник

Создано: 02 апреля 2011 22:12
· Личное сообщение · #11

http://alexcnt.livejournal.com/619.html
вот она)



Ранг: 5.5 (гость)
Активность: 0=0
Статус: Участник

Создано: 02 апреля 2011 22:46
· Личное сообщение · #12

Адресовано reversecode:
В компиляторе VS2010 выбрал Release -> дизассемблировал файл .obj из папки Release -> получил следующий натюрморт, не могу разобраться - можно ли из этого что-то получить? Если что то нета сделал - поправьте, большое спасибо!


9081_02.04.2011_EXELAB.rU.tgz - бред.jpg



Ранг: 114.8 (ветеран), 41thx
Активность: 0.10
Статус: Участник

Создано: 02 апреля 2011 23:00
· Личное сообщение · #13

reversecode пишет:
в большинстве случаев
i++; работает через регистр mov eax, var; add eax,1; mov var,eax
++i; очень часто встречается как inc var;

это при прочих равных (параметры оптимизации, окружающий код и т.п.)? с какими компилями так?




Ранг: 2014.5 (!!!!), 1278thx
Активность: 1.340.25
Статус: Модератор
retired

Создано: 02 апреля 2011 23:03
· Личное сообщение · #14

Брать да обозначать как код через кнопочку C нужные участки.
И пользуйся кнопкой Правка.



Ранг: 5.5 (гость)
Активность: 0=0
Статус: Участник

Создано: 03 апреля 2011 01:41
· Личное сообщение · #15

Archer пишет:
Брать да обозначать как код через кнопочку C нужные участки.И пользуйся кнопкой Правка.


Это делать в самой Ida?




Ранг: 2014.5 (!!!!), 1278thx
Активность: 1.340.25
Статус: Модератор
retired

Создано: 03 апреля 2011 09:13
· Личное сообщение · #16

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



Ранг: 5.5 (гость)
Активность: 0=0
Статус: Участник

Создано: 03 апреля 2011 12:55
· Личное сообщение · #17

Откомпилил прогу из одной строчки в Release
int x = 2;
Ida выдала мильон строк. Не подскажете как эффективно найти место моего кода или примерчик простой кинуть.
Спасибо!



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

Создано: 03 апреля 2011 13:21 · Поправил: VodoleY
· Личное сообщение · #18

Alexcnt а брейк поинтами пользоваца религия не позволяет? с вызовом СПУ. Изучи сначала среду в которой ты пишеш

-----
Наша работа во тьме, Мы делаем, что умеем. Мы отдаем, что имеем, Наша работа во тьме....





Ранг: 2014.5 (!!!!), 1278thx
Активность: 1.340.25
Статус: Модератор
retired

Создано: 03 апреля 2011 13:39
· Личное сообщение · #19

Вообще говоря, мне не совсем понятно, накой ты полез в иду, когда студия вполне кошерно показывает асм-код указанного места в сорцах при отладке.

| Сообщение посчитали полезным: VodoleY, Fahrenheit

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

Создано: 03 апреля 2011 14:09
· Личное сообщение · #20

Archer видимо об этом человеку никто не говорили

-----
Наша работа во тьме, Мы делаем, что умеем. Мы отдаем, что имеем, Наша работа во тьме....




Ранг: 5.5 (гость)
Активность: 0=0
Статус: Участник

Создано: 03 апреля 2011 15:14
· Личное сообщение · #21

как это сделать в VS 2010 можете написать?
Буду весьма благодарен




Ранг: 2014.5 (!!!!), 1278thx
Активность: 1.340.25
Статус: Модератор
retired

Создано: 03 апреля 2011 15:40
· Личное сообщение · #22

Вот прям правой кнопкой жмёшь при отладке на нужном куске и выбираешь Go to disassembly. Сходи уже в гугл почитай, а.




Ранг: 170.1 (ветеран), 96thx
Активность: 0.090.01
Статус: Участник

Создано: 03 апреля 2011 19:45
· Личное сообщение · #23

Alexcnt пишет:
как эффективно найти место моего кода

Указать в опциях компиляции создание карты памяти - там будут все адреса.



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

Создано: 03 апреля 2011 21:20 · Поправил: VodoleY
· Личное сообщение · #24

Archer надо добавить в смайлы еще один, бьющего головой об стену
ты виш какими серьезными весчами люди занимаюца.. а ты реверс реверс...

-----
Наша работа во тьме, Мы делаем, что умеем. Мы отдаем, что имеем, Наша работа во тьме....


| Сообщение посчитали полезным: sen

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

Создано: 04 апреля 2011 05:00
· Личное сообщение · #25

++ (как и --) были выдуманы для того что транслировать код в более короткую команду, если таковая имеется в наборе ассемблера (в интеле - INC, DEC). откуда K&R было знать что тот же интел потом потеряет к ней интерес и даже откажется от однобайтовой формы.

Alexcnt пишет:
Решил попробовать написать свою собственную статью)

слава КК покоя не дает ?


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


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