Я хочу получить трассировку стека при сбое приложения. Я понимаю, что параметр -rdynamic позволяет получить полную трассировку стека с именами функций. Но меня беспокоит, будет ли какое-либо влияние на производительность моего приложения.
Добавит ли параметр -rdynamic linker значение gcc/g++?
Ответ 1
Да, есть, хотя это очень специфично и обычно не вызывает беспокойства.
Параметр -rdynamic указывает компоновщику добавлять символы в таблицы символов, которые обычно не требуются во время выполнения. Это означает, что есть больше, возможно, намного больше символов, которые динамический компоновщик должен просачиваться во время выполнения для разрешения символа.
В частности, поскольку поиск таблиц символов в системах на основе GNU реализуется с использованием хэша, наличие большего количества символов увеличивает вероятность возникновения хеш-коллизий. Поскольку все симломы, которые сталкиваются в хэш-таблице, сидят в списке, компоновщик времени выполнения должен пересекать список и сравнивать, используя memcmp, каждое имя символа. Наличие большего количества символов в хеш-символе означает наличие более длинных списков, поэтому для разрешения каждого динамического символа потребуется больше времени.
Эта ситуация немного хуже для С++, затем C, с множеством идентично префиксных имен символов из-за имен классов.
На практике это влияет только на первый раз, когда используется символ, и поэтому, если ваше приложение не очень велико и содержит много символов, оно не будет ощущаться.
В редких случаях, когда ваше приложение велико, трюки, такие как prelinking, могут быть использованы для преодоления накладных расходов.