I have asked a similar question before, but I realize that I can't make heads or tails of the macrology and templateness. I'm a C (rather than C++) programmer.
What does F() actually do? When does it stuff characters into pgmem? When does it pull characters out of pgmem? Does it cache them? How does it handle low-memory situations?
There are no templates involved, only function overloading. The
F()
macro does two things:uses
PSTR
to ensure that the literal string is stored in Flash memory (the code space rather than the data space). However,PSTR("some string")
cannot be printed because it would receive a simplechar *
which represents a base address of the string stored in Flash. Dereferencing that pointer would access some random characters from the same address in data. Which is whyF()
also...casts the result of
PSTR()
to__FlashStringHelper*
. Functions such asprint
andprintln
are overloaded so that, on receiving a__FlashStringHelper*
argument, they correctly dereference the characters in the Flash memory.