Как заставить GCC убирать при линковке inline-функции?

Модераторы: Hawk, Romeo, Absurd, DeeJayC, WinMain

Ответить
eqltv
Сообщения: 6
Зарегистрирован: 05 фев 2010, 14:22

Пишу на avr-gcc, очень критичен размер кода, в распоряжении имеется всего 2 килобайта. Использую ключ -Os. Компилятор встраивает многие функции (некоторые из них в коде помечены inline), но из полученного объектного файла не убирает их бесполезные тела, а это лишняя сотня байт! Как ему объяснить, что не нужно оставлять код, который никогда не вызывается? Под объектным файлом я понимаю тот, который получается в итоге, а не промежуточный.
eqltv
Сообщения: 6
Зарегистрирован: 05 фев 2010, 14:22

Проблема решена не лучшим способом - файл был переименован в .cpp и всё было обернуто в анонимный нэймспейс. Размер кода сократился в полтора раза.
Аватара пользователя
Romeo
Сообщения: 3126
Зарегистрирован: 02 мар 2004, 17:25
Откуда: Крым, Севастополь
Контактная информация:

Почему не лучшим способом? Это как раз отличный способ. Всё, что ты хочешь делать, нужно делать явно, используя конструкции языка.

В Unix-подобных системах все имена функций из шареных библиотек по умолчанию являются экспортируемыми. Компилятор не мог выбросить тела по той причине, что кто-то мог залинковать библиотеку снаружи и вызвать эти функции. Как только ты спрятал функции в анонимный неймспейс, они стали невидны не только в экспортной секции, но даже во всех остальных единицах трансляции, потому компилятор без проблем провёл оптимизацию.
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
eqltv
Сообщения: 6
Зарегистрирован: 05 фев 2010, 14:22

Не лучшим - потому что был чистый си, а стал с плюсами. Другой язык!
Аватара пользователя
Romeo
Сообщения: 3126
Зарегистрирован: 02 мар 2004, 17:25
Откуда: Крым, Севастополь
Контактная информация:

Ах, вот в чём проблема :) Я просто не думал, что она именно в этом.

В чистом С можно добиться того же эффекта, поставив ключевое слово static перед объявлением функции.
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
Аватара пользователя
Romeo
Сообщения: 3126
Зарегистрирован: 02 мар 2004, 17:25
Откуда: Крым, Севастополь
Контактная информация:

И, кстати, второй способ решить эту проблему на чистом С (ровна как и на С++) - это создать файл, в котором будут перечисляться экспортируемые из либы функции и скормить его компилятору (опцию компилятора навскидку не вспомню). В этом случае все функции, которые там не будут перечислены, будут запрещены для внешней линковки, что так же, как и при использовании static/namespace, позволит провести оптимизацию.
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
eqltv
Сообщения: 6
Зарегистрирован: 05 фев 2010, 14:22

Спасибо за совета про static, не знал! Но вот с файлами для компилятора вряд ли, потому что у меня не библиотека, а исполняемый файл (как бы). А он не должен экспортировать ничего на архитектуре AVR.
Аватара пользователя
Romeo
Сообщения: 3126
Зарегистрирован: 02 мар 2004, 17:25
Откуда: Крым, Севастополь
Контактная информация:

Я думал, что shared library. Если executable, то второй способ отпадает.
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
Ответить