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

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

Ответы [ 6 ]

18 голосов
/ 15 мая 2009

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

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

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

10 голосов
/ 15 мая 2009

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

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

8 голосов
/ 15 мая 2009

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

++i to inc [ax]

и

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

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

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

7 голосов
/ 15 мая 2009

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

++i;
i = i + 1;

или там было больше контекста?

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

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

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

3 голосов
/ 15 мая 2009

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

0 голосов
/ 27 мая 2009

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

...