Так вот. Насколько я знаю, стандарт С++ не оговаривает реализацию виртуальных методов, т.е. даже само существование vtab отдается на откуп компилятору.
Компилируя простой код в Кейле (для Cortex M3) я заметил интересную вещь.
Код
class Base
{
public:
virtual ~Base() {}
};
class Derived : public Base
{
public:
int b;
virtual ~Derived() {}
};
{
public:
virtual ~Base() {}
};
class Derived : public Base
{
public:
int b;
virtual ~Derived() {}
};
Если создать экземпляр класса Derived на стеке (локально), то все в порядке, все компилируется и отлаживается. При этом размер компилированного кода составляет 356 байт.
Если создать экземпляр глобально или статически, то код резко распухает до 1144 байт и отладка повисает на листинге:
0x0000045C BEAB BKPT 0xAB
0x0000045E E7FE B 0x0000045E
Опытным путем я обнаружил, что если в стартапном файле задать ненулевой размер кучи (а нулевой он по дефолту), то отладка идет нормально.
Вопрос, собственно, вот в чем - а нафига тут куча-то? И как ее безболезненно убрать? А то лишний килобайт без всякой причины как-то не радует.
UPD: Попробовал размещать глобальный экземпляр по фиксированному адресу с помощью __attribute__((at(0x10000800))) - ничего не изменилось, куча все равно нужна. Но зачем?