Я давно программирую, но я новичок в программировании Arduino и AVR. Главный вопрос, который у меня возникает по поводу программирования этих микроконтроллеров, заключается в том, есть ли серьезные различия в разработке кода в объектно-ориентированных классах по сравнению с более традиционным встроенным программированием, которое я видел во многих примерах?
Другими словами, в мире контроллеров Arduino / AVR есть ли экономия памяти и производительности за счет использования классов или наоборот?
Скажем, например, у нас есть класс:
class SomeClass(){
private:
int x;
int y;
public:
void foo();
void bar();
}
SomeClass thisClass;
thisClass.foo();
thisClass.bar();
Будет ли какая-либо производительность или увеличение памяти при разработке программы более встроенным образом, например:
int x;
int y;
void foo(){ /*** Do something ***/};
void bar(){ /*** Do more stuff ***/};
Я попытался выполнить некоторые операции поиска в Stack Exchange и Google, но не смог найти ответ, который я искал, и самым близким, что мне удалось найти, был вопрос об обмене стека.
Причина, по которой я спрашиваю об этом, заключается в том, что у меня есть проект, который должен быть как можно более легким, и я не понимаю, как мне следует разрабатывать свою программу в этой среде.
редактировать
Спасибо за ответы, это пролило свет на вещи. Есть одна вещь, которая мне не совсем понятна.
Скажем, у вас есть проект, который вы разрабатываете, который использует u8glib следующим образом:
class UserInterface{
private:
U8GLIB_ST7920_128X64 Display;
public:
UserInterface();
}
Как бы вы обошлись, используя «Динамическую память», как:
UserInterface::UserInterface(){
UserInterface::Display = U8GLIB_ST7920_128X64(LCD_E_PIN, LCD_RW_PIN, LCD_RS_PIN, U8G_PIN_NONE);
}
источник
UserInterface::UserInterface() : Display(LCD_E_PIN, LCD_RW_PIN, LCD_RS_PIN, U8G_PIN_NONE) { ... }
, Необходимые параметры конструктора Display должны быть переданы в конструктор UserInterface.Причина, по которой вы не можете найти ответ, заключается в том, что ответом является как Да, так и Нет.
Что касается базового класса - определения вашего класса с помощью методов и т. Д. И создания объектов из него - разница в конечном результате невелика по сравнению с «ванильным» C. Оптимизации компилятора теперь настолько хороши, что производительность остается той же. Да, может быть небольшое увеличение использования памяти, так как вы передаете дополнительный указатель при каждом вызове метода (вместо
foo(int x)
васfoo(MyClass *this, int x)
), но это настолько мало, что не будет заметным.Большие различия возникают, когда вы начинаете играть с полиморфизмом и другими сложными темами. При запуске этих сложных программ компилятор не всегда может определить, какие функции требуются, а какие нет, и он не может вырезать неиспользуемые функции ( «сборка мусора» ). Таким образом, вы можете в конечном итоге получить больший код.
Это не означает, что код медленнее, просто куски кода, которые торчат вокруг, никогда ничего не делают.
Более важным является управление вашей динамической памятью лучше, чем вы привыкли. Поскольку памяти так мало, куча очень мала, и в результате она очень легко фрагментируется. Динамическое создание и уничтожение объектов (
new myClass
,delete myClassObject
, и т.д.) очень плохо. Объекты класса действительно должны быть статически определены (в глобальной области видимости наиболее распространены) или временно размещены в стеке (локальные экземпляры). В противном случае вы напрашиваетесь на неприятности - и первое, о чем вы узнаете, это странные вещи (никаких сообщений об ошибках или исключений, видите ли ...).источник