Программирование на С:разница между ++i и i=i+1 с точки зрения ассемблера?

StackOverflow https://stackoverflow.com/questions/867692

Вопрос

Это был вопрос на собеседовании.Я сказал, что они одинаковые, но это было признано неправильным ответом.С точки зрения ассемблера, есть ли какая-то мыслимая разница?Я скомпилировал две короткие программы на C, используя оптимизацию gcc по умолчанию и -S, чтобы увидеть выходные данные ассемблера, и они одинаковы.

Это было полезно?

Решение

Интервьюер, возможно, хотел получить примерно такой ответ:

i=i+1 придется загрузить значение i, добавьте к нему один, а затем сохраните результат обратно в i.В отличие, ++i может просто увеличить значение с помощью одной инструкции ассемблера, поэтому теоретически это может быть более эффективно.Однако большинство компиляторов оптимизируют эту разницу, и сгенерированный код будет точно таким же.

Кстати, тот факт, что вы умеете смотреть на ассемблер, делает вас лучшим программистом, чем 90% людей, с которыми мне приходилось брать интервью на протяжении многих лет.Утешайтесь тем, что вам не придется работать с невежественным неудачником, который брал у вас интервью.

Другие советы

Похоже, вы были правы, а они ошибались.У меня была похожая проблема на собеседовании, где я дал правильный ответ, который был сочтен неправильным.

Я уверенно аргументировал свою точку зрения со своим интервьюером, который явно обиделся на мою наглость.Работу я не получил, но, опять же, работать под началом человека, который «все знает», тоже было бы не очень желательно.

Вы, вероятно, правы.Наивный компилятор может сделать:

++i to inc [ax]

и

i = i + 1 to add [ax], 1

но любой полуразумный компилятор просто оптимизирует добавление 1 к первой версии.

Все это предполагает, что соответствующая архитектура имеет инструкции inc и add (как в x86).

В защиту интервьюера можно сказать, что контекст решает все.Каков тип Я?Мы говорим о C или C++ (или о каком-то другом языке, подобном C)?Вам дали:

++i;
i = i + 1;

или был еще контекст?

Если бы меня спросили об этом, мой первый ответ был бы "я нестабим?" Если ответ - да, то разница огромна.Если нет, то разница небольшая и семантическая, но с прагматической точки зрения ее нет.Доказательством этого является различие в дереве синтаксического анализа и конечном значении генерируемых поддеревьев.

Таким образом, похоже, что вы правильно поняли прагматическую сторону, но ошибочную сторону семантической/критической мысли.

Чтобы атаковать интервьюера (без контекста), мне пришлось бы задаться вопросом, какова цель вопроса.Если бы я задал вопрос, я бы хотел использовать его, чтобы выяснить, знает ли кандидат тонкие семантические различия, как генерировать дерево разбора, как мыслить критически и так далее, и тому подобное.Обычно я задаю своим собеседникам вопрос на букву C, на который почти каждый кандидат ошибается — и это намеренно.Меня вообще не волнует ответ на вопрос, Меня волнует путь, который я пройду с кандидатом достичь понимания, которое говорит мне гораздо больше о том, что правильно/неправильно в пустяковом вопросе.

В C++ это зависит от того, i является int или объектом.Если это объект, он, вероятно, создаст временный экземпляр.

контекст здесь является главным, потому что в оптимизированной сборке выпуска компилятор оптимизирует i++, если он доступен для простого [inc eax].тогда как что-то вроде int some_int = i++ должно будет сохранить значение i в some_int FIRST и только затем увеличивать i.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top