1. fysiks is correct. sizeof is an operator and its result is known at compile time. The compilr replaces it with the actual value in the generated binary.
There is no runtime overhead.
Things are different with something like ArraySize, which is a function. It should be cached before the loop to avoid the runtime overhead of calling the function(pushing, popping the stack, jumping in a different code location) with each loop iteration.
2. I again must agree with fysiks. He explained it well so I will not reiterate. I just want to say that static is not meant to be used as an optimization technique. It can be used as such in very specific scenarios, but this is a side effect of how static works and not its main purpose.