Här är ett tips man inte ser så ofta: globala variabler är det bästa vän!
Normalt vill sky sådan design som pesten, men det är lägen där man inte är begränsad till någon enstaka kB RAM och ett totalt flash-utrymme på < 64 kB.
Frågan var
Citat:
om man använder String och skriver över den säg 20000 gånger kommer den att behöva mer minne för varje gång eller använder den samma mängd minne vid varje "överskrivning"(Om längden på strängen är lika lång varje gång)?
Jag vet ju nu att längden på strängen kommer aldrig att vara längre än ca 50 tecken.
Rent logiskt är svaret: nej, instanser av "String" i Arduino frigör alltid sitt minne. I den version som är aktuellt för tillfälle allokeras på byten när så mycket minne som behövs.
Rent praktiskt: är en väldigt överhängande risk att ditt program kommer krascha när det kört tillräckligt länge om storleken på strängen är någorlunda stor och dess längd varierar en hel del.
Orsaken är att systemet du kör på har en extremt simpel heap-implementationen (datastrukturen som hanterar fritt minne) + när det bara finns någon enstaka kB RAM totalt sett är det rätt omöjligt att göra speciellt smarta saker i en heap-allokator.
Rekommenderade sättet att jobba med mikrokontrollers är att allokera allt RAM som behövs, endast exklusive det som kommer användas för automatiska variabler (de som ligger "på stacken" vid anrop). Det garanterar att programmet aldrig kan misslyckas p.g.a. brist på RAM (är även så man måste designa programvara som används i styrsystem för flygplan, tåg och liknande, just för att programmet inte ska kunna sluta fungera för att heap:en fragmenterats).
Har noterat att det finns flera implementationer av WString.h/WString.cpp (som burkar vara namnet på String klassen i Arduino). Vissa ser till att alltid allokera exakt på byte:en när vilket är en dålig idé p.g.a att man då får fragmentering även om man har alla strängobjekt globalt.
Den implementation som jag har på disken (som är den som kommer med Arduino för ESP8266, ESP32 och AVR) frigör bara minne om strängobjektets destruktor körs (d.v..s om sträng-objektet inte längre kan nås). Annars ökas bara kapaciteten vid behov, minnet återanvänds om man stoppar in en mindre sträng.
Så vad du då gör: i setup(), stoppa in dummy-strängar som är av längsta storlek du någonsin behöver. Det ser till att allt minne allokeras vid start, endera lyckas det och ditt program kommer fungera eller så kraschar det direkt.
"Crash Early
A dead program normally does a lot less damage than a crippled one."
The Pragmatic programmer