2015-11-03 2 views
2

Представьте, что следующая функция существует в статической библиотеке (* .a, * .lib):устранения Мертвого кода на коммутаторе заявлении

int func_foo(int i) { 
    switch (i) { 
    case 1: 
     return foo_bar(); 
    case 2: 
     return foo_baz(); 
    case 3: 
     return foo_bat(); 
    default: 
     return -1; 
    } 
} 

Если пользователь этой библиотека вызывает эту функцию и передает только в 1 , сможет (или может) компилятор удалить вызовы на 2 и 3?

Будет ли компилятор также удалять функции foo_baz() и foo_bat(), если на них нет ссылок на какие-либо другие функции (например, удаление мертвого кода)?

+0

Как «пользователь этой библиотеки» глотает библиотеку? Ссылка на исходный код или какой-то готовый скомпилированный двоичный файл? –

+0

Предположим, что это скомпилированная статическая библиотека (например, * .a или ее эквивалент). – MarkP

ответ

2

Если включено Whole Program Optimization, а func_foo не помечено для экспорта из библиотеки общих разделяемых объектов или библиотеки DLL, достойный компилятор, такой как MSVC, может удалить и удалить этот мертвый код. Таким образом, код будет выглядеть следующим образом (без учета функции встраивания конечно):

int func_foo(int i) { 
    return foo_bar(); 
} 

В противном случае, если WPO не включен и func_foo имеет внешнюю связь (по умолчанию), компилятор не может удалить мертвый код. Наконец, если WPO не включен и func_foo имеет статическую связь, компилятор может удалить мертвых. В последнем случае MSVC не выполнял оптимизацию. Другие компиляторы могут выполнить его, хотя.

Будет ли компилятор также удалить foo_baz() и foo_bat() функции, если они не ссылаются на любые другие функции?

Опять же, это зависит от того, включен или выключен WPO, и если он выключен, это зависит от связи функции. Во всех случаях функции не должны экспортироваться. Кроме того, вы должны явно сообщить компилятору удалить ненужные функции с помощью переключателей компилятора. Например, в MSVC вам необходимо использовать компилятор /Gy и переключатель /OPT:NOREF.

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