Will putting F() in a function create a new Flash reference every time it's ran?

Is this:

void loop(){
    Serial.println(F("string to store in flash"));

The same as this:

void loop(){
    static const String fl_string PROGMEM = "string to store in flash";

From this post it seems like F() is a shortcut for storing strings in PROGMEM-- so would the first method create a ton of PROGMEM references of "string to store in flash"? Or would it always reference the first one?

String can't be storred in progmem and it doesn't store to progmem the char array you assign to it. class String is something like a manager for the char array.

F is a macro. macros are evaluated at compile time. char array in F will be only once in flash memory