В Linux, используя gcc
если я объявлю функцию в динамической библиотеке как __attribute__((always_inline))
и затем я динамически загружаю эту библиотеку, будет ли функция встроена динамическим компоновщиком?
Я собираю динамические библиотеки, в -O3
и не передавая никаких флагов оптимизации времени ссылки -flto
Реальный вопрос: стоит ли объявлять функцию как всегда встроенную в динамической библиотеке, когда она вызывается в большинстве случаев из другой библиотеки?
Динамический компоновщик glibc не встроит никаких функций, найденных в загружаемых им объектах.
Однако, если вы объявите и определить always_inline
функция в заголовочном файле, компилятор встроит эту функцию, даже если в DSO есть реализация. Это имеет два последствия:
Вы получаете преимущество в скорости от врезки.
Вся информация в определении функции была скомпилирована в вызывающую сторону, поэтому может оказаться невозможным заменить DSO другой реализацией.
Другими словами, это, вероятно, немного быстрее, но обеспечить совместимость с ABI неожиданно намного сложнее.
То, стоит ли это делать, зависит от требований к производительности и ожидаемых изменений в библиотеке.
Других решений пока нет …