реклама на сайте
подробности

 
 
> Keil и виртуальные методы (С++)
poganoe_lamerish...
сообщение Nov 17 2012, 16:42
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 28
Регистрация: 4-07-11
Пользователь №: 66 052



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

Так вот. Насколько я знаю, стандарт С++ не оговаривает реализацию виртуальных методов, т.е. даже само существование vtab отдается на откуп компилятору.
Компилируя простой код в Кейле (для Cortex M3) я заметил интересную вещь.
Код
class Base
{
    public:
    virtual ~Base() {}
};

class Derived : public Base
{

    public:
    int b;

    virtual ~Derived() {}
};


Если создать экземпляр класса Derived на стеке (локально), то все в порядке, все компилируется и отлаживается. При этом размер компилированного кода составляет 356 байт.

Если создать экземпляр глобально или статически, то код резко распухает до 1144 байт и отладка повисает на листинге:
0x0000045C BEAB BKPT 0xAB
0x0000045E E7FE B 0x0000045E

Опытным путем я обнаружил, что если в стартапном файле задать ненулевой размер кучи (а нулевой он по дефолту), то отладка идет нормально.
Поглядев на экземпляры класса в watch, я увидел, что указатели __vtab указывают в разные места у локального и глобального (или статического) экземпляров. Локальный ссылался в оперативку, глобальный - во флеш. Ошибся, пардон.

Вопрос, собственно, вот в чем - а нафига тут куча-то? И как ее безболезненно убрать? А то лишний килобайт без всякой причины как-то не радует.

UPD: Попробовал размещать глобальный экземпляр по фиксированному адресу с помощью __attribute__((at(0x10000800))) - ничего не изменилось, куча все равно нужна. Но зачем?

Сообщение отредактировал poganoe_lamerishe - Nov 17 2012, 19:50
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 27th June 2025 - 09:05
Рейтинг@Mail.ru


Страница сгенерированна за 0.0134 секунд с 7
ELECTRONIX ©2004-2016