Нет прямой, гарантированной связи между исходным кодом C ++ и сгенерированным ассемблером.Исходный код C ++ определяет определенную семантику, и компилятор выводит машинный код, который будет реализовывать наблюдаемое поведение этой семантики.То, как компилятор делает это, и фактический код, который он выводит, может сильно различаться даже на одном и том же оборудовании;Я был бы очень разочарован компилятором, который генерировал код, который сравнивал 0
с 0
, а затем делал условный переход, если результаты были равны, независимо от того, какой исходный код C ++.
В вашемНапример, единственным наблюдаемым поведением в вашем коде является возврат 0
в ОС.Все, что генерирует компилятор, должно делать это (и не иметь другого наблюдаемого поведения).Код, который вы показываете, не является оптимальным для этого:
xorl %eax, %eax
ret
- это действительно все, что нужно.Но, конечно, компилятор может генерировать гораздо больше, если он этого хочет.(Например, ваш код устанавливает фрейм для поддержки локальных переменных, даже если их нет. Многие компиляторы делают это систематически, потому что большинство отладчиков ожидают этого, и запутываются, если фрейма нет.)
Что касается оптимизации, это зависит от компилятора.С g ++ -O0
(это буква O, за которой следует число ноль) отключает всю оптимизацию.Это по умолчанию, однако, так что это действительно то, что вы видите.Помимо нескольких разных уровней оптимизации, g ++ поддерживает включение или отключение отдельных оптимизаций.Возможно, вы захотите взглянуть на полный список: http://gcc.gnu.org/onlinedocs/gcc-4.6.2/gcc/Optimize-Options.html#Optimize-Options.