Почему компилятор MSVC 10.0 часто игнорирует встроенное ключевое слово?

У меня есть довольно сложный код на C ++, который используется в системе реального времени и поэтому абсолютно чувствителен к скорости. Он был разработан для Linux, и для его ускорения многие функции были помечены ключевым словом «inline» и помещены в заголовочные файлы для обеспечения возможности встраивания.

Теперь я перенес этот код в Windows (msvc 10.0, Windows 7), и он работает примерно на 30% медленнее. После некоторого профилирования я обнаружил, что проблема в основном в том, что многие функции не встроены. Когда я использую вместо этого «__forceinline», я легко вижу ускорение на 10-20%.

У кого-нибудь есть объяснение этому? Только ли алгоритм в msvc работает гораздо более консервативно? Или я просто сделал что-то не так, например, пропустил опцию конфигурации?

4

Решение

Вам нужно проверить настройки оптимизации MSVC:

Project Properties -> C/C++ -> Optimization

Там есть настройка под названием "Favor size or speed" что существенно изменяет степень готовности компилятора.

5

Другие решения

Что такое inline ?

inline это ключевое слово, которое сигнализирует компилятору, что определение метода представлено встроенным. Как правило, метод должен быть определен только в одном TU (исходный файл, примерно), и inline позволяет определить метод в заголовке, который будет включен во многие различные TU, и избежать жалоб компилятора / компоновщика на дубликаты символов. Компоновщик объединит символы соответствующим образом.

Что такое не inline ?

inline ни в коем случае не является приказом для компилятора встроить функцию. Исторически он мог использоваться как таковой, но оптимизаторы все лучше и лучше решали, когда (а не) встроить, и inline «подсказка» в настоящее время малоэффективна.

Как обеспечить встраивание?

Компиляторы обычно предоставляют конкретные ключевые слова / атрибуты, требующие «большего» встраивания. В MSVC, например, __forceinline будет подсказка сильно (но все же просто подсказка), что метод должен быть встроенным.

4

По вопросам рекламы [email protected]