|
Снова к вопросу о разбухании кода arm-gcc |
|
|
|
May 30 2012, 06:22
|
Частый гость
 
Группа: Участник
Сообщений: 77
Регистрация: 27-05-11
Пользователь №: 65 303

|
Добрый день господа форумчане! Настроил среду разработки Eclipse как сказано тут http://makesystem.net/?p=988 Использую toolchain Codebench Lite! Написал простенький список (приложен ниже) и скомпилировал проект когда посмотрел на размер кода был немного обескуражен! Размер кода стал равен 87384 Байт! В оптимизаторе поставил генерировать отдельные секции и в линкере удалять неиспользуемые секции, но не помогает! В чём тут может быть дело? PS Может поменять компилятор, вернее версию??? Что то где-то слышал что помогает! Вот только на какую менять???
Сообщение отредактировал glonium - May 30 2012, 06:17
Прикрепленные файлы
list.rar ( 1.64 килобайт )
Кол-во скачиваний: 21
|
|
|
|
2 страниц
1 2 >
|
 |
Ответов
(1 - 25)
|
May 30 2012, 06:52
|
Знающий
   
Группа: Свой
Сообщений: 771
Регистрация: 16-07-07
Из: Волгодонск
Пользователь №: 29 153

|
Ну смотри - ты приложил хидер с шаблоном. Шаблон после компиляции любым компилятором занимает ровно 0 байт  Место занимают конкретные инстанцирования этого шаблона. Так что чтобы что-то тебе сказать, надо посмотреть на все остальное - приложи компилябельный проект целиком. #include "exception.h" намекает на использование исключений. Исключения требуют довольно жирного рантайма - может быть дело в этом. У меня минимальный elf занимает порядка 100 байт или около того - int main() { while (1); } с отключенным стартовым кодом. Если добавить стартовый код, размер станет несколько больше. Если добавить поддержку исключений - станет килобайт 60 или около того.
|
|
|
|
|
May 30 2012, 08:04
|
Частый гость
 
Группа: Участник
Сообщений: 77
Регистрация: 27-05-11
Пользователь №: 65 303

|
Прошу прошения что то не подумал выложить проект! Исключения самописанные! Вот проект целиком
Прикрепленные файлы
first.rar ( 957.2 килобайт )
Кол-во скачиваний: 17
|
|
|
|
|
May 30 2012, 09:47
|

Гуру
     
Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095

|
Насчет исключений не подскажу, полагаю, что поддержка их зарыта глубоко в компиляторе и просто так переписать библиотеку не получится. QUOTE (glonium @ May 30 2012, 12:12)  Да и поэкспериментировав я наткнулся на то что оператор new тоже много чего тянет за собой! Да, тянет. Используйте свой менеджер памяти, например вот этот.
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
Jun 1 2012, 13:58
|
Частый гость
 
Группа: Участник
Сообщений: 77
Регистрация: 27-05-11
Пользователь №: 65 303

|
Поэкспериментировав с перегрузкой операторов new и delete пришёл к интересным заключениям! Вариант 1 : Код #include "stmlib/stm32f10x.h" #include <stdlib.h>
void *operator new (size_t size) { return malloc(size); } void operator delete (void *p) { free(p); return; }
int main (void) { int *a=new int(10); while (1){}; return 0; } Компилиться в 4 Кб с использованием стандартных free и malloc! 2 Случай Код /* void *operator new (size_t size) { return malloc(size); } void operator delete (void *p) { free(p); return; } */ int main (void) { int *a=new int(10); while (1){}; return 0; } Компилиться в 80Кб! Почему такая разница? Вроде стандартный new и delete опирается на стандартные malloc и free!
|
|
|
|
|
Jun 1 2012, 15:00
|
Частый гость
 
Группа: Участник
Сообщений: 77
Регистрация: 27-05-11
Пользователь №: 65 303

|
Цитата А если так: CODE #include <new> ..... */ int main (void) { int *a=new(std::nothrow) int(10); while (1){}; return 0; } Так тоже порядка 80Кб! Да и вообще у меня подозрение что в c++ другой аллокатор памяти потяжелее чем в с!
|
|
|
|
|
Jun 1 2012, 15:45
|
Частый гость
 
Группа: Участник
Сообщений: 77
Регистрация: 27-05-11
Пользователь №: 65 303

|
Цитата P.S. И какой компилятор?. Использую CodeBench руководствовался это статьёй при установке IDE http://makesystem.net/?p=988Цитата glonium, вы не могли бы проект целиком выложить. Интересно бы посмотреть, а то у меня вообще не собирается.
Прикрепленные файлы
first.zip ( 912 килобайт )
Кол-во скачиваний: 18
|
|
|
|
|
Jun 1 2012, 16:37
|
Частый гость
 
Группа: Участник
Сообщений: 77
Регистрация: 27-05-11
Пользователь №: 65 303

|
Цитата Чтобы не подтягивались исключения, надо компилировать с ключом -fno-exceptions. Поставил ключик -fno-exceptions все равно размер кода не уменьшается, при этом виртуальные функции не использую! PS видать это вовсе не исключения так весят а аллокатор памяти!
|
|
|
|
|
Jun 1 2012, 17:38
|

фанат дивана
     
Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684

|
Цитата(glonium @ Jun 1 2012, 22:37)  PS видать это вовсе не исключения так весят а аллокатор памяти! Посмотрите map-файл, и увидите, что это всё-таки исключения. К сожалению, ключик -fno-exceptions не всегда соблюдается. Попробуйте объявить new/delete как Код void * operator new (size_t size, const std::nothrow_t&) throw() { ... }
void operator delete(void * pobject, const std::nothrow_t&) throw() { .. } И добавьте всё же к своему проекту файл из моего предыдущего сообщения.
--------------------
Если бы я знал, что такое электричество...
|
|
|
|
|
Jun 1 2012, 22:25
|
Частый гость
 
Группа: Участник
Сообщений: 77
Регистрация: 27-05-11
Пользователь №: 65 303

|
Цитата Посмотрите map-файл, и увидите, что это всё-таки исключения. Я если честно не до конца разобрался как пользоваться map и как от туда узнать что сколько весит (непонятные имена функций) Подскажите пожалуйста где можно прочитать про map! Заранее спасибо!
|
|
|
|
|
Jun 2 2012, 14:33
|

фанат дивана
     
Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684

|
А чего там уметь-то? Смотрите, видите "eh_exception.o" - значит, исключения присутствуют  Ну а так, там в самом начале есть строчка: Archive member included because of file (symbol) То есть, формат такой подключенная_библиотека (имя_объекта_из_этой_библиотеки.o) имя_файла_из_за_которого_подключили_этот_библиотечный_объект (имя_функции_из_за_которой_подключили) Попробуйте сделать, как я сказал в предыдущем сообщении, думаю, что поможет. Кстати, не забудьте остальные варианты new/delete: Код void * operator new(size_t size){ return operator new(size, std::nothrow); } void operator delete(void * pobject){ operator delete(pobject, std::nothrow); } void * operator new[](size_t size){ return operator new(size, std::nothrow); } void operator delete[](void * pobject){ operator delete[](pobject, std::nothrow); } void * operator new[](size_t size, const std::nothrow_t&) throw(){ return operator new(size, std::nothrow); } void operator delete[](void * pobject, const std::nothrow_t&) throw(){ operator delete(pobject, std::nothrow); }
--------------------
Если бы я знал, что такое электричество...
|
|
|
|
|
Jun 11 2012, 10:38
|

Местный
  
Группа: Участник
Сообщений: 340
Регистрация: 25-10-05
Из: Пермь, Россия
Пользователь №: 10 091

|
Цитата(glonium @ Jun 8 2012, 17:12)  Народ а может кто подсказать если я использую RTTI и throw то к программе добавляется кусок порядка 80кБ, есть ли гарантия что он не вырастет необоснованно? Т.е один раз приклеился и всё больше ничего не надо! Если Вы имеете в виду библиотечный код - то гарантия полная. Библиотечный модуль может быть загружен линкером только один раз.
--------------------
Всего наилучшего, Alex Mogilnikov
|
|
|
|
|
Jun 11 2012, 11:52
|
Местный
  
Группа: Участник
Сообщений: 214
Регистрация: 22-03-10
Из: Саратов
Пользователь №: 56 123

|
Цитата(glonium @ Jun 10 2012, 13:56)  так то так но вот предположим у нас есть список объектов базоаого класса в виде указателей на них, при помощи dynamic_cast<*Iface> можно определить поддерживает ли данный инстанс интерфейс Iface и заодно преобразовать к классу интерфейса, если не поддерживает dynamic_cast вернёт NULL!
Конечно можно поступить и менее красиво, держать в классе флаги поддержки интерфейса и по их значениям кастовать!
Или ещё вариант но тоже менее красивый завести виртуальные функции которые кастуют к конкретному интерфейсу! "флаги поддержки интерфейса" в классе - это призанак "моей первой программы на С++", часто появляются, когда люди много писали на простом Си. Опрос возможностей с помощью dynamic_cast - это уже "вторая программа на С++" - осознание недостаатков первой. Вариант с виртуальными функциями чуть лучше, но всё равно опрос возможностей или попытка узнать конкретный тип объекта почти всегда являются признаками неудачного проектирования. Этот самый тип объекта просто не нужно терять, чтоб потом не нужно было его динамически узнавать. Единственное адекватное применение опроса типа или возможностей объекта, dynamic_cast в частности и RTTI вообще - это ИМХО разработка своей библиотеки сериализации. Рекомендую по этому по этому вопросу почитать книжку: Стефан К. Дьюхэрст "Скользкие места С++". Там очень хорошо этот вопрос расписан.
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|