Ich programmiere schon eine ganze Weile, aber ich bin neu in der Arduino- und AVR-Programmierung. Die Hauptfrage, die ich zur Programmierung dieser Mikrocontroller habe, ist, ob es große Unterschiede beim Entwerfen von Code in objektorientierten Klassen gegenüber der traditionelleren Inline-Programmierung gibt, die ich in vielen Beispielen gesehen habe.
Mit anderen Worten, gibt es in der Welt der Arduino / AVR-Controller Einsparungen bei Speicher und Leistung bei Verwendung von Klassen oder umgekehrt?
Nehmen wir zum Beispiel an, wir haben eine Klasse:
class SomeClass(){
private:
int x;
int y;
public:
void foo();
void bar();
}
SomeClass thisClass;
thisClass.foo();
thisClass.bar();
Würde es irgendwelche Leistungs- oder Speichergewinne geben, die das Programm inlineer gestalten, wie:
int x;
int y;
void foo(){ /*** Do something ***/};
void bar(){ /*** Do more stuff ***/};
Ich habe versucht, einige Suchanfragen in Stack Exchange und Google durchzuführen, konnte jedoch nicht die Antwort finden, die ich suche. Das nächste, was ich finden konnte, war diese Stack Exchange-Frage.
Der Grund, warum ich danach frage, ist, dass ich ein Projekt habe, das so leicht wie möglich sein muss, und mir ist nicht klar, wie ich mein Programm in dieser Umgebung gestalten soll.
Bearbeiten
Vielen Dank für die Antworten, dies hat Licht ins Dunkel gebracht. Eines ist mir nicht ganz klar.
Angenommen, Sie haben eine Klasse, die Sie entwerfen und die u8glib wie folgt verwendet:
class UserInterface{
private:
U8GLIB_ST7920_128X64 Display;
public:
UserInterface();
}
Wie würden Sie sich mit "Dynamic Memory" wie folgt fortbewegen?
UserInterface::UserInterface(){
UserInterface::Display = U8GLIB_ST7920_128X64(LCD_E_PIN, LCD_RW_PIN, LCD_RS_PIN, U8G_PIN_NONE);
}
quelle
UserInterface::UserInterface() : Display(LCD_E_PIN, LCD_RW_PIN, LCD_RS_PIN, U8G_PIN_NONE) { ... }
. Die erforderlichen Anzeigekonstruktorparameter sollten an den UserInterface-Konstruktor übergeben werden.Der Grund, warum Sie die Antwort nicht finden können, ist, dass die Antwort sowohl Ja als auch Nein ist.
Für grundlegende Klassenaufgaben - Definieren Ihrer Klasse mit Methoden usw. und Instanziieren von Objekten daraus - gibt es kaum einen Unterschied im Endergebnis im Vergleich zu "Vanille" C. Die Optimierungen des Compilers sind jetzt so gut, dass die Leistung genau gleich ist. Ja, es kann ein leichter Anstieg der Speichernutzung, da Sie einen zusätzlichen Zeiger mit jedem Methodenaufruf vorbei sind (statt
foo(int x)
Sie habenfoo(MyClass *this, int x)
) , aber das ist so klein wie nicht wahrnehmbar.Die großen Unterschiede ergeben sich, wenn Sie anfangen, mit Polymorphismus und anderen fortgeschrittenen Themen zu spielen. Wenn der Compiler mit diesen komplexen Programmen beginnt, kann er nicht immer herausfinden, welche Funktionen erforderlich sind und welche nicht, und er kann die nicht verwendeten Funktionen nicht ausschneiden ( "Garbage Collection" ). Möglicherweise erhalten Sie also einen größeren Code.
Das bedeutet nicht, dass der Code langsamer ist, sondern nur herumhängende Codestücke, die niemals etwas bewirken.
Von größerer Bedeutung ist die bessere Verwaltung Ihres dynamischen Speichers als Sie es gewohnt sind. Da so wenig Speicher vorhanden ist, ist der Heap sehr klein und wird daher sehr leicht fragmentiert. Dynamische Erzeugung und Zerstörung von Objekten (
new myClass
,delete myClassObject
usw.) ist sehr schlecht. Klassenobjekte müssen entweder statisch definiert sein (im globalen Bereich am häufigsten) oder vorübergehend auf dem Stapel zugewiesen werden (lokale Instanzen). Andernfalls bitten Sie um Ärger - und als erstes werden Sie feststellen, dass seltsame Dinge passieren (keine Fehlerberichte oder Ausnahmen, sehen Sie ...).quelle