2014-01-22 2 views
1

Может ли современный компилятор (GCC) быть достаточно умным, чтобы оптимизировать эту функцию no-op? Я знаю, что они могут оптимизировать работу no-op, но мне интересно, насколько хорошо они могут определить, действительно ли вызов функции - это не-op.Может ли современный компилятор оптимизировать «ложные» пути?

void someFunction(){ 
    if false{ 
     doFunction() 
    } 
} 
+0

Чтобы увидеть поведение, вы можете запустить код в gdb и выполнить функцию. В то время как в gdb, прежде чем вы переходите в код, нажмите Ctrl + x, а затем 2, чтобы увидеть свой код и соответствующую сборку. Когда вы перейдете на код, который был оптимизирован, gdb напечатает оптимизированное значение сообщения. – abhi

+1

http://en.wikipedia.org/wiki/Dead_code_elimination –

ответ

3

Ну, для начала, было бы не собрать, что на всех, так как вы пропустили круглые скобки вокруг вашего состояния :-)

Но, с этим фиксированным, я думаю, вы обнаружите, что if заявление сам (и его тело) можно оптимизировать из существования. Функция someFunction() почти наверняка останется, поскольку вы можете ее назвать откуда-то, и что где-то может быть из совершенно другой единицы перевода (исходный файл).

Если это было static, и компилятор мог вывести, что функция не была использована, можно было бы удалить всю функцию. Это работает, потому что, будучи статичным, его нельзя было бы вызывать из другого места.

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

+0

Я просто писал какой-то быстрый псевдокод, который не должен быть реальной функцией – Igglyboo

0

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

Смежные вопросы