Посл.ответ |
Сообщение |
Ранг: 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.34↘0.25 Статус: Модератор retired
|
Создано: 02 апреля 2011 16:12 · Личное сообщение · #2
Для обычного инта разница будет вряд ли. Для других типов, особенно сложных, разница может быть очень даже.
| Сообщение посчитали полезным: |
Ранг: 1053.6 (!!!!), 1078thx Активность: 1.06↘0.81 Статус: Участник
|
Создано: 02 апреля 2011 16:18 · Личное сообщение · #3
Alexcntвключите не дебаг, а релиз я вас уверяю они отличаются если будут одинаковые попробуйте другую студию и так же проверте в gcc
| Сообщение посчитали полезным: |
Ранг: 114.8 (ветеран), 41thx Активность: 0.1↘0 Статус: Участник
|
Создано: 02 апреля 2011 18:37 · Поправил: _ruzmaz_ · Личное сообщение · #4
разница между вариантами 1 и 2 не в том, что делается с i и как, а в том, когда (перед или после вычисления значения выражения, в котором используется переменная, к которой в пределах этого выражения применен оператор инкремента) следовательно, если выражение состоит лишь из переменной с примененным к ней оператором инкремента (как в вариантах 1 и 2), то разницы между вариантами 1 и 2 быть не должно
| Сообщение посчитали полезным: |
Ранг: 23.5 (новичок), 5thx Активность: 0.02↘0 Статус: Участник
|
Создано: 02 апреля 2011 19:34 · Личное сообщение · #5
Alexcnt пишет: зависит ли результат от типа компилятора? в принцыпе, да, зависит но больше зависит от уровня оптимизации
| Сообщение посчитали полезным: |
Ранг: 65.3 (постоянный), 10thx Активность: 0.02↘0 Статус: Участник
|
Создано: 02 апреля 2011 19:54 · Личное сообщение · #6
Как написано в FAQ по C++, для int разницы не будет. Впрочем, это неудивительно. Я думаю, для всех встроенных типов это верно. От компилятора может зависеть все, что угодно. Есть компиляторы, не соответствующие стандарту. Можно написать компилятор, который будет гарантировать, что i++ выполняется дольше, чем ++i. Вот ЧаВо по С++: http://www.parashift.com/c++-faq-lite/index.html
| Сообщение посчитали полезным: |
Ранг: 1053.6 (!!!!), 1078thx Активность: 1.06↘0.81 Статус: Участник
|
Создано: 02 апреля 2011 20:08 · Личное сообщение · #7
они сущетсвенно отличаются но оптимизация всегда по разному срабатывает в большинстве случаев i++; работает через регистр mov eax, var; add eax,1; mov var,eax ++i; очень часто встречается как inc var;
| Сообщение посчитали полезным: |
Ранг: 590.6 (!), 408thx Активность: 0.36↘0.18 Статус: Модератор
|
Создано: 02 апреля 2011 21:45 · Личное сообщение · #8
Про сложные типы уже упомянули. Вставлю свои 5 коп. Типовая реализация i++ выглядит как { T r = i; ++i; return r; } Соответственно, ++i будет в большинстве случаев либо такое же, либо быстрее i++.
----- старый пень | Сообщение посчитали полезным: |
Ранг: 512.7 (!), 360thx Активность: 0.27↘0.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.1↘0 Статус: Участник
|
Создано: 02 апреля 2011 23:00 · Личное сообщение · #13
reversecode пишет: в большинстве случаев i++; работает через регистр mov eax, var; add eax,1; mov var,eax ++i; очень часто встречается как inc var; это при прочих равных (параметры оптимизации, окружающий код и т.п.)? с какими компилями так?
| Сообщение посчитали полезным: |
Ранг: 2014.5 (!!!!), 1278thx Активность: 1.34↘0.25 Статус: Модератор retired
|
Создано: 02 апреля 2011 23:03 · Личное сообщение · #14
Брать да обозначать как код через кнопочку C нужные участки. И пользуйся кнопкой Правка.
| Сообщение посчитали полезным: |
Ранг: 5.5 (гость) Активность: 0=0 Статус: Участник
|
Создано: 03 апреля 2011 01:41 · Личное сообщение · #15
Archer пишет: Брать да обозначать как код через кнопочку C нужные участки.И пользуйся кнопкой Правка. Это делать в самой Ida?
| Сообщение посчитали полезным: |
Ранг: 2014.5 (!!!!), 1278thx Активность: 1.34↘0.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.35↘0 Статус: Участник
|
Создано: 03 апреля 2011 13:21 · Поправил: VodoleY · Личное сообщение · #18
Alexcnt а брейк поинтами пользоваца религия не позволяет? с вызовом СПУ. Изучи сначала среду в которой ты пишеш
----- Наша работа во тьме, Мы делаем, что умеем. Мы отдаем, что имеем, Наша работа во тьме.... | Сообщение посчитали полезным: |
Ранг: 2014.5 (!!!!), 1278thx Активность: 1.34↘0.25 Статус: Модератор retired
|
Создано: 03 апреля 2011 13:39 · Личное сообщение · #19
Вообще говоря, мне не совсем понятно, накой ты полез в иду, когда студия вполне кошерно показывает асм-код указанного места в сорцах при отладке.
| Сообщение посчитали полезным: VodoleY, Fahrenheit |
Ранг: 488.1 (мудрец), 272thx Активность: 0.35↘0 Статус: Участник
|
Создано: 03 апреля 2011 14:09 · Личное сообщение · #20
Archer видимо об этом человеку никто не говорили
----- Наша работа во тьме, Мы делаем, что умеем. Мы отдаем, что имеем, Наша работа во тьме.... | Сообщение посчитали полезным: |
Ранг: 5.5 (гость) Активность: 0=0 Статус: Участник
|
Создано: 03 апреля 2011 15:14 · Личное сообщение · #21
как это сделать в VS 2010 можете написать? Буду весьма благодарен
| Сообщение посчитали полезным: |
Ранг: 2014.5 (!!!!), 1278thx Активность: 1.34↘0.25 Статус: Модератор retired
|
Создано: 03 апреля 2011 15:40 · Личное сообщение · #22
Вот прям правой кнопкой жмёшь при отладке на нужном куске и выбираешь Go to disassembly. Сходи уже в гугл почитай, а.
| Сообщение посчитали полезным: |
Ранг: 170.1 (ветеран), 96thx Активность: 0.09↘0.01 Статус: Участник
|
Создано: 03 апреля 2011 19:45 · Личное сообщение · #23
Alexcnt пишет: как эффективно найти место моего кодаУказать в опциях компиляции создание карты памяти - там будут все адреса.
| Сообщение посчитали полезным: |
Ранг: 488.1 (мудрец), 272thx Активность: 0.35↘0 Статус: Участник
|
Создано: 03 апреля 2011 21:20 · Поправил: VodoleY · Личное сообщение · #24
Archer надо добавить в смайлы еще один, бьющего головой об стену ты виш какими серьезными весчами люди занимаюца.. а ты реверс реверс...
----- Наша работа во тьме, Мы делаем, что умеем. Мы отдаем, что имеем, Наша работа во тьме.... | Сообщение посчитали полезным: sen |
Ранг: 39.6 (посетитель), 21thx Активность: 0.02↘0 Статус: Участник
|
Создано: 04 апреля 2011 05:00 · Личное сообщение · #25
++ (как и --) были выдуманы для того что транслировать код в более короткую команду, если таковая имеется в наборе ассемблера (в интеле - INC, DEC). откуда K&R было знать что тот же интел потом потеряет к ней интерес и даже откажется от однобайтовой формы. Alexcnt пишет: Решил попробовать написать свою собственную статью) слава КК покоя не дает ?
| Сообщение посчитали полезным: |