Перейти к содержанию
    

Снова к вопросу о разбухании кода arm-gcc

Добрый день господа форумчане!

Настроил среду разработки Eclipse как сказано тут http://makesystem.net/?p=988

Использую toolchain Codebench Lite!

Написал простенький список (приложен ниже) и скомпилировал проект когда посмотрел на размер кода был немного обескуражен!

Размер кода стал равен 87384 Байт!

В оптимизаторе поставил генерировать отдельные секции и в линкере удалять неиспользуемые секции, но не помогает!

В чём тут может быть дело?

 

PS Может поменять компилятор, вернее версию??? Что то где-то слышал что помогает!

Вот только на какую менять???

list.rar

Изменено пользователем glonium

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Ну смотри - ты приложил хидер с шаблоном. Шаблон после компиляции любым компилятором занимает ровно 0 байт :) Место занимают конкретные инстанцирования этого шаблона.

 

Так что чтобы что-то тебе сказать, надо посмотреть на все остальное - приложи компилябельный проект целиком.

 

#include "exception.h" намекает на использование исключений. Исключения требуют довольно жирного рантайма - может быть дело в этом.

 

У меня минимальный elf занимает порядка 100 байт или около того - int main() { while (1); } с отключенным стартовым кодом.

 

Если добавить стартовый код, размер станет несколько больше. Если добавить поддержку исключений - станет килобайт 60 или около того.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Прошу прошения что то не подумал выложить проект! Исключения самописанные!

Вот проект целиком

first.rar

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

дык а map ты не пытался сгенерить? Сгенери, посмотри кто у тебя самый толстый...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Да сгенерил только ничего не понял из него в нём куча всего!

 

Да вы правы к сожалению всё дело в исключениях!

они в моём случае добавляют около 70 кб!

А есть ли способ обойти это или только отказом от исключений?

 

Да и поэкспериментировав я наткнулся на то что оператор new тоже много чего тянет за собой!

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Насчет исключений не подскажу, полагаю, что поддержка их зарыта глубоко в компиляторе и просто так переписать библиотеку не получится.

Да и поэкспериментировав я наткнулся на то что оператор new тоже много чего тянет за собой!
Да, тянет. Используйте свой менеджер памяти, например вот этот.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Спасибо за ответ! Интересное предложение. А со своим диспетчером памяти у меня механизм виртуальных функций будет работать, а так же dunamic_cast<>???

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А со своим диспетчером памяти у меня механизм виртуальных функций будет работать, а так же dynamic_cast<>???
Виртуальные функции работают (проверено, использую), за них конструктор отвечает. А он вызывается после выделения памяти оператором new(). А про dynamic_cast я только краем уха слышал, может кто-то другой подскажет. Хотя навряд ли она завязана на менеджер памяти - он лишь выделяет кусок памяти запрошенного размера. Если dynamic_cast работает с placement new(), то и с этим работать должен.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Поэкспериментировав с перегрузкой операторов 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!

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А если так:

#include <new>
.....
*/
int main (void)
{
    int *a=new(std::nothrow)  int(10);
    while (1){};
    return 0;
}

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А если так:

CODE

#include <new>

.....

*/

int main (void)

{

int *a=new(std::nothrow) int(10);

while (1){};

return 0;

}

Так тоже порядка 80Кб!

 

Да и вообще у меня подозрение что в c++ другой аллокатор памяти потяжелее чем в с!

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Так тоже порядка 80Кб!

 

Да и вообще у меня подозрение что в c++ другой аллокатор памяти потяжелее чем в с!

 

glonium, вы не могли бы проект целиком выложить. Интересно бы посмотреть, а то у меня вообще не собирается.

 

P.S. И какой компилятор?.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

P.S. И какой компилятор?.

Использую CodeBench руководствовался это статьёй при установке IDE http://makesystem.net/?p=988

 

glonium, вы не могли бы проект целиком выложить. Интересно бы посмотреть, а то у меня вообще не собирается.

first.zip

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Чтобы не подтягивались исключения, надо компилировать с ключом -fno-exceptions.

При использовании чисто виритуальных функций иногда подключаются исключения и с этим ключиком. В этом случае спасает вот этот файл. Просто добавьте его к своему проекту.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Чтобы не подтягивались исключения, надо компилировать с ключом -fno-exceptions.

Поставил ключик -fno-exceptions все равно размер кода не уменьшается, при этом виртуальные функции не использую!

 

PS видать это вовсе не исключения так весят а аллокатор памяти!

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...