Вложение не выполнено: тело функции может быть перезаписано во время соединения
Сегодня я обновил Ubuntu 12.04, который, как я думаю, имел g++ - 4.6 для Ubuntu 12.10 с g++ - 4.7.2. В моем коде у меня было несколько функций, отмеченных как __attribute__((always_inline))
. Причиной этого было просто то, что профилирование показало мне, что это значительно повысило производительность кода. Он отлично работал с g++ 4.6, но теперь с g++ 4.7 Я получаю сообщение об ошибке:
error: inlining failed in call to always_inline 'void func_name (args)': тело функции может быть перезаписано во время ссылки
Я не могу поделиться своим фактическим кодом, я пытался сузить его, но когда я слишком сильно меняю ошибку, это не помогает. Меня интересует первопричина этого сообщения об ошибке.
Ответы
Ответ 1
Я не собирался отвечать на это сам, но я случайно нашел ответ через несколько минут после того, как я опубликовал.
Причиной этого (загадочного) сообщения об ошибке было то, что функция не была помечена как inline
, только __attribute((always_inline))
.
Ответ 2
Для нас проблема заключалась в том, что мы также не смогли объявить функцию "статической". "attribute((always_inline))" означает, в обычном тексте, "встроить это и никогда не включать тело функции", а сообщение об ошибке означает "компилятор должен был включать тело функции". В нашем случае, поскольку функция не была "статичной", она должна была быть доступна для внешней ссылки.