Pull to refresh
26
0
Сергей Келер @nwwind

Сисадмин

Send message
6 байтов на базовый класс уходит.
я посчитал в следующей статье.
такты не считал, конечно :)
Тут рекомендуют и то и то. Оно друг другу не мешает, оказывается.
Задумался.
так и есть. городить новый. в это суть подхода. что в этом страшного?
О! Это в каком месте? внутри конструктора наследуемого класса или вместо него?

class newclass: public baseclass {
using baseclass;
или
newclass() { using baseclass; }
Про прагму ванс слышал, но так как-то привычнее, ну старорежимный я, и спокойнее.
Я использовал
#ifndef A
#define A
//
#endif
ещё в 1985 году, когда только Цэ у нас появился.
Привычка.
Да-да. Вкурил, спасибо.
Утоптал в 6 байтов в итоге, уже лучше.
На гитхабе уже enum class
Здесь чем проще, тем лучше. Для начинающих.
Отступ, хмм… не так принципиально ведь?
Наотимизировал SmartButton и он теперь 6 байт жрёт.
причём 2 забирает слово virtual :( причём один раз и путь лучше в базовом классе.
Это позднее связывание. Фуфу. Не наш метод. Оно как раз подъедает по 4 байта в ардуине на указатель. :)
Если можно обойтись ранним, лучше им.
это один из красивых сюрпризов С++

Надо покурить это на досуге, спасибо.
Я не совсем понял, что имеется в виду под «писать».

Вот это:
PressButton(byte bt_pin) : SmartButton(bt_pin) {};
А есть ли какая-то синтаксическая конструкция модная типа сишного
struct {
byte flag : 1,
byte pin : 4
}


Вот применительно к enum class бы? Туда же упаковать?
А то 11 байтов много.
— 4 время, никуда не деться, хотя да, можно в 13 бит запихать тк нас только хвост интересует от времени.
— 1 пин.
— 2 словарь.
— 2 статус.
Итого 9. Хмм… Где ещё два байта?
Переписал на enum class input: byte { };
получилось 9 байт.
Хмм… а должно быть 7.

Запушил новый вариант с enum class, мне понравилось.
Я думал про шаблон, да. Я пока не настолько владею плюсами. Я закончил кодить, когда они только появились и были странным глумлением над С.
Мне не нравится, например, что надо конструкторы у нового класса надо писать. Лучше б сгенерить.
CRTP не даст ли доступ к приватным переменным порождённому классу? Это было бы плохо и создаёт потенциальные проблемы.
Размер SmartButton 11 байт, унаследованного PressButton 12.
Я лишь описал очевидный подход. Глубоко не копал. Надеюсь, компилятор меня понял и сунул всё по максимуму на флеш :)
Когда начинаешь считать байты, вся красота сходит и получается голый Си и портянка кода в 50 страниц одним куском.

Например, состояния кнопки, можно впихнуть по две кнопки в байт, а верхнего уровня класс по 8 кнопок на байт (по биту) может держать.

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

В примере с кнопкой, я бы предположил, что компилятор сделает ранее связывание и не будет никаких лишних указателей. Можно проверить сделав sizeof у объекта.
Проверил — размер PressButton ровно на 1 байт больше (byte sw), чем у родительского SmartButton.

Беда начинается, если бы были указатели на объекты.
Как мне видится удобный обработчик клика в соответствии с концепцией Arduino.
В начале создаём объект типа smartbutton. Как-то типа «SmartButton mybutt».
А в loop мы получаем его состояние, и делаем нужные дела, типа «if (mybutt.pressed) {......}»


Это не лучший подход. Особенно для любителей delay(). Прикинь, ты уже три раза нажал на кнопку и отпустил, а выполнение только добралось до твоего if (key.pressed()) через задержки.

Я предлагаю асинхронное выполнение. То есть, клик обрабатывается в том месте, где случился. В МКА в статье, я указал место, где вставлять свой код. В SmartButton нет функции pressed, но есть метод onClick() пустой, виртуальный, и его надо определить унаследовав класс. Как вариант, можно сделать колбеки, функции, что будут вызываться по событиям, но они жрут память тоже тк событий много, на каждое надо указатель и не все нужны.
Примеры для SmartButton да, надо написать поинтереснее и на весь интерфейс класса. Согласен.

Information

Rating
Does not participate
Location
Всеволожск, Санкт-Петербург и область, Россия
Registered
Activity