Кто-нибудь знает как ардуино выделяет память под vtable?

Фермер
Offline
Зарегистрирован: 22.01.2020

Заметил, что очередной virtual сожрал сразу 38 байт. При этом, класс еще даже не имеет наследников.

Эксперименты показали, что virtual в разных схожих ситуациях отъедает весьма разный объем SRAM.

Такое ощущение, что размер vtable растет скачками.

По моим прикидкам, в принципе, каждый virtual должен кушать по 2 байта на метод базового и каждого его наследника. Реальность совсем какая-то иная.

 

sadman41
Offline
Зарегистрирован: 19.10.2016

Ардуино тут не при делах.

mykaida
mykaida аватар
Offline
Зарегистрирован: 12.07.2018

Никто не идеален - напишите лучше.

Фермер
Offline
Зарегистрирован: 22.01.2020

sadman41 пишет:

Ардуино тут не при делах.

ну, понятно, что вопрос к gcc в итоге

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

А нам-то Вы это зачем сказали? Чтобы донести до нас эту информацию? Или просто захотелось поплакаться в жилетку и повыть на Луну? 

sadman41
Offline
Зарегистрирован: 19.10.2016

Фермер пишет:

sadman41 пишет:

Ардуино тут не при делах.

ну, понятно, что вопрос к gcc в итоге

Так отключите ему оптимизацию - картина будет другой.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

sadman41 пишет:

Так отключите ему оптимизацию - картина будет другой.

не палите контору и не разрушайте розовый, идилический мир ТС :-)

Фермер
Offline
Зарегистрирован: 22.01.2020

sadman41 пишет:

Так отключите ему оптимизацию - картина будет другой.

Что-то я непонял. Тогда прога будет в 3 раза больше чем у ардуино progmem.

 

sadman41
Offline
Зарегистрирован: 19.10.2016

Фермер пишет:

sadman41 пишет:

Так отключите ему оптимизацию - картина будет другой.

Что-то я непонял. Тогда прога будет в 3 раза больше чем у ардуино progmem.

И что? Вам нужно было, чтобы всё было предсказуемо - Вы это получили.

Фермер
Offline
Зарегистрирован: 22.01.2020

Там какая-то более глубинная проблема. Поначалу же все было гладко: по 2 байта на каждый виртуал. А тут – шарах 38, причем не за что. У класса ведь еще нет детей, а прирост в гору - как за 18.

 

sadman41
Offline
Зарегистрирован: 19.10.2016

Тогда, очевидно, Вам придётся погружаться в алгоритмы оптимизации gcc.

JArduino
Offline
Зарегистрирован: 18.05.2019

Алгоритмы оптимизации gcc тут, думаю, ни при чем. Все должно быть четко.

Фермер, как используется класс с этим виртуальным мембером? Сколько экземпляров?

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

JArduino пишет:

Алгоритмы оптимизации gcc тут, думаю, ни при чем. Все должно быть четко.

Ну, почему, если не создавать ни одного экземпляра и нигде ни разу не обращаться к статическим членам, то класс просто будет выброшен из кода целиком. Дописываешь, дописываешь, а код всё не растёт, а потом ... ой, насколько сразу код увеличился. Тоже касается и отдельных частей класса.

Фермер
Offline
Зарегистрирован: 22.01.2020

jarduino, 

это как бы массив 3*3

Фермер
Offline
Зарегистрирован: 22.01.2020

я про рост sram говорил, а не progmem, вообще-то

vtable сидит в sram

 

JArduino
Offline
Зарегистрирован: 18.05.2019
Ну, вот и считаем:
3*3*2*2 + 2 = 38
 
Все сошлось. И никакой высшей математики и страшных алгоритмов оптимизации.
Почитайте как работает vtable.
 
Расчет примерно такой:
Каждый класс с виртуалом даёт 1 запись в vtable *2 байта + 1 указатель в классе на vtable * 2 байта
Каждый виртуал класса дает 1 запись в vtable * 2 байта 
 
+ то же самое для каждого наследника.
 
Итого 1 экземпляр с одним виртуалом сожрет 1*2*2 + 2 = 6 байт.
У Вас их 9, значит 38.
 
Так что поаккуратнее там с C++ на внедренке )
 
Витуальные функции, кстати, насколько я помню, gcc вовсе не режутся, даже если не используются. Достаточно воспользоваться экземпляром, чтобы все виртуалы прилипли.
 
Фермер
Offline
Зарегистрирован: 22.01.2020
Вот же ж ;)
 
Спасибо, дружище!
 
А по поводу C++ - да уж, к хорошему легко привыкаешь.
Теперь трудно себя переделать.