Как заставить GCC убирать при линковке inline-функции?
Модераторы: Hawk, Romeo, Absurd, DeeJayC, WinMain
Пишу на avr-gcc, очень критичен размер кода, в распоряжении имеется всего 2 килобайта. Использую ключ -Os. Компилятор встраивает многие функции (некоторые из них в коде помечены inline), но из полученного объектного файла не убирает их бесполезные тела, а это лишняя сотня байт! Как ему объяснить, что не нужно оставлять код, который никогда не вызывается? Под объектным файлом я понимаю тот, который получается в итоге, а не промежуточный.
Проблема решена не лучшим способом - файл был переименован в .cpp и всё было обернуто в анонимный нэймспейс. Размер кода сократился в полтора раза.
- Romeo
- Сообщения: 3126
- Зарегистрирован: 02 мар 2004, 17:25
- Откуда: Крым, Севастополь
- Контактная информация:
Почему не лучшим способом? Это как раз отличный способ. Всё, что ты хочешь делать, нужно делать явно, используя конструкции языка.
В Unix-подобных системах все имена функций из шареных библиотек по умолчанию являются экспортируемыми. Компилятор не мог выбросить тела по той причине, что кто-то мог залинковать библиотеку снаружи и вызвать эти функции. Как только ты спрятал функции в анонимный неймспейс, они стали невидны не только в экспортной секции, но даже во всех остальных единицах трансляции, потому компилятор без проблем провёл оптимизацию.
В Unix-подобных системах все имена функций из шареных библиотек по умолчанию являются экспортируемыми. Компилятор не мог выбросить тела по той причине, что кто-то мог залинковать библиотеку снаружи и вызвать эти функции. Как только ты спрятал функции в анонимный неймспейс, они стали невидны не только в экспортной секции, но даже во всех остальных единицах трансляции, потому компилятор без проблем провёл оптимизацию.
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
Не лучшим - потому что был чистый си, а стал с плюсами. Другой язык!
- Romeo
- Сообщения: 3126
- Зарегистрирован: 02 мар 2004, 17:25
- Откуда: Крым, Севастополь
- Контактная информация:
Ах, вот в чём проблема
Я просто не думал, что она именно в этом.
В чистом С можно добиться того же эффекта, поставив ключевое слово static перед объявлением функции.

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