Одна из моих недавних программ сильно зависит от встраивания нескольких «горячих» функций для повышения производительности. Эти горячие функции являются частью внешнего файла .c
, который я бы предпочел не менять.
К сожалению, хотя Visual довольно хорош в этом упражнении, gcc и clang — нет. Видимо, из-за того, что горячие функции находятся внутри другого .c
, они не могут их инлайнить.
Это оставляет мне 2 варианта:
- Либо включите непосредственно соответствующий код в целевой файл. На практике это означает
#include "perf.c"
вместо#include "perf.h"
. Тривиальное изменение, но выглядит некрасиво. Ясно, что это работает. Просто немного сложнее объяснить цепочке сборки, чтоperf.c
должен быть там, но не компилироваться и не компоноваться. Используйте
-flto
для оптимизации времени соединения. Это выглядит чище, и это то, чего Visual достигает по умолчанию.Проблема в том, что с
-flto
этап связывания gcc генерирует несколько предупреждений, которые кажутся внутренними. ошибки (они относятся к части кода из стандартных библиотек, поэтому у меня мало контроля над ними). Это смущает при нацеливании на политику «нулевого предупреждения» (даже несмотря на то, что сгенерированный двоичный файл в порядке).Что касается clang, он просто не работает с
-flto
из-за ошибки упаковки (ошибка загрузки плагина: LLVMgold.so), которая, по-видимому, очень распространена во многих дистрибутивах Linux.
2 вопроса:
- Есть ли способ отключить эти предупреждающие сообщения при использовании
-flto
в gcc? - Какой из двух методов, описанных выше, кажется лучшим, учитывая плюсы и минусы?
- Необязательно: есть ли другое решение?
.inl
и #include внизу соответствующего заголовка. - person Sneftel   schedule 05.07.2015