From solidity docs:
Free functions are always internal functions and are meant to replace internal library functions and their very special behaviour.
How do free functions differ from libraries? Libraries use DelegateCall and I've read somewhere that DelegateCalls are more expensive to run for the first call (haven't seen this in testing though) to prevent DoS attacks — so are free functions cheaper?
I'm also curious to learn if there is a difference in the context of contract upgradability