Płytka Arduino jest wyposażona w bardzo małą ilość pamięci Ram. Arduino Uno posiada 2048 B pamięci RAM dostępnej dla przechowywania zmiennych.
Więc jeżeli chcemy stosować stałe tak aby użyć jak najmniej (a najlepiej wcale) pamięci ram to lepiej użyć const czy #define?
Czym jest #define?
#define jest bardzo często błędnie rozumiane ponieważ ludzie myślą, że jest to stała jednak tak na prawdę jest to instrukcja preprocesora.
Działa to w ten sposób że Przez define definiujemy sobie pewną „stałą” którą kompilator zamieni na wartość którą podaliśmy
więc jeżeli piszemy taki kod
1 2 3 4 5 6 7 8 9 10 |
#define pin 13 void setup() { pinMode(pin, OUTPUT); } void loop() { digitalWrite(pin, HIGH); delay(500); digitalWrite(pin, LOW); delay(500); } |
To kompilator zamieni go na coś takiego
1 2 3 4 5 6 7 8 9 10 |
#define pin 13 void setup() { pinMode(13, OUTPUT); } void loop() { digitalWrite(13, HIGH); delay(500); digitalWrite(13, LOW); delay(500); } |
Co to jest const?
Słowo kluczowe „const” informuje kompilator że zmienna (lub jej wskaźnik) nie mogą być modyfikowane. Jednak const nadal jest zmienną. W zależności od tego jak kompilator ją „odczyta” może ona używać lub nie pamięć RAM. Jednak kompilator avr-gcc jest na tyle „inteligentny” aby wiedzieć, że zmienna z modyfikatorem const nie może być aktywną zmienną dlatego nie pozostawia jej w pamięci RAM.
1 2 3 4 5 6 7 8 9 10 |
const int pin=13; void setup() { pinMode(pin, OUTPUT); } void loop() { digitalWrite(pin, HIGH); delay(500); digitalWrite(pin, LOW); delay(500); } |
Więc ten kod nie będzie używał pamięć ram dla const.
WIELKA BITWA
#define
1 2 3 4 5 6 7 8 |
avr-size -C sketch_nov11a.cpp.elf AVR Memory Usage ---------------- Device: Unknown Program: 4818 bytes (.text + .data + .bootloader) Data: 155 bytes (.data + .bss + .noinit) |
Const
1 2 3 4 5 6 7 8 |
avr-size -C sketch_nov11a.cpp.elf AVR Memory Usage ---------------- Device: Unknown Program: 4818 bytes (.text + .data + .bootloader) Data: 155 bytes (.data + .bss + .noinit) |
Zdziwiony?
Obojętnie czy korzystasz z #define czy const ilość pamieci Ram jest taka sama.
W takim razie rodzi się pytanie kiedy uzywać define a kiedy const?
Teoretycznie oba można używać w tych samych miejscach jednak używanie #define może okazać się złą praktyką ponieważ podczas użycia nie jest sprawdzana poprawność kodu.
Czyli jeżeli na przykład napiszemy tak kod. To w każdym miejscu będziemy mieli błąd w programie. Przy dużej ilości #define dość ciężko będzie dojść do ładu w kodzie.
1 2 3 4 5 6 7 8 9 10 |
#define pin 13; void setup() { pinMode(pin, INPUT); } void loop() { digitalWrite(pin, HIGH); delay(500); digitalWrite(pin, LOW); delay(500); } |
1 2 3 4 5 6 7 8 9 10 |
#define pin 13; void setup() { pinMode(13;, INPUT); } voidloop() { digitalWrite(13;, HIGH); delay(500); digitalWrite(13;, LOW); delay(500); } |
Wniosek
Kompilator avr-gcc jest na tyle „inteligentny” aby nie zapisywać const do pamieci ram a przy użyciu #define możemy natknąć się na „nieprzyjemności”. Więc lepiej będzie używać const.