Преимущества глобальных переменных перед статическими членами класса?
Во встроенной системе мы часто используем глобальные переменные, чтобы поддерживать низкое потребление динамической памяти в куче и стеке. Но глобальные переменные также считаются плохой практикой программирования, если они не используются в глобальном смысле, то есть используются только внутри одной или двух функций .
Поэтому я действительно хочу использовать возможности, чтобы защитить свой код от самого себя. Конечно, механизм создания экземпляров С++ должен избегать встроенных систем с низкими ресурсами, таких как arduino. Поэтому я пишу классы только со статическими членами (и функциями-членами). Многие из библиотек, поставляемых с ардуино, похоже, тоже работают таким образом.
Мне любопытно, есть ли какой-либо недостаток в перемещении статических переменных или даже константных массивов (предназначенных для хранения в программной памяти) из глобального пространства имен в пространство имен класса и превращении их в частные?
Меня в первую очередь интересуют недостатки, связанные с комбинацией ООП с платформой arduino (с использованием arduino uno) с avr-gcc.
@Ariser, 👍6
1 ответ
Лучший ответ:
Я не вижу особых недостатков в использовании статических членов класса вместо глобальных переменных в Arduino. В конечной программе они будут управляться так же.
Единственная разница, которую я вижу, может возникнуть в зависимости от того, как вы проектируете свои классы (если дизайн правильный, то особых проблем не возникнет):
Предположим, вы декалируете класс A:
class A {
public:
void f();
void g();
...
static void z();
private:
static int myStaticField;
...
};
если вам нужен экземпляр A
для метода f()
, которому не нужен myStaticField
, то это поле все равно существует в вашем SRAM-пространство.
Но это крайний случай, так как в хорошем OOD myStaticField
должен понадобиться, как только вам понадобится работать с классом A (какой бы метод вы ни использовали).
- Будет ли .ino-скетч ардуино компилироваться непосредственно на GCC-AVR?
- Получение имени перечисления из экземпляра перечисления
- Объявленная переменная внутри void setup не видится в void loop
- Как писать скетчи, совместимые с makefile?
- Как улучшить этот Код? (или как передать строку Char в функцию, чтобы она вела себя как переменная)
- Как объявить массив переменного размера (глобально)
- Какие накладные расходы и другие соображения существуют при использовании структуры по сравнению с классом?
- Что лучше использовать: #define или const int для констант?
Но если я создам экземпляры
A
,myStaticField
будет зарезервирован в ОЗУ (или где-то еще) только один раз, не так ли?, @AriserДа, конечно, в этом разница между статическими и нестатическими элементами., @jfpoilpret