hes wrong, correct string handling means processing the string serially one char at a time. carrying a size_t along with your strings like that is a waste of a perfectly good gpr.
this was true in the 1980s, but now if you want speed, you want to use vectorized instructions, so you want to do as much work as possible 32 bytes at a time for large strings. if you don't store a length, your string processing will be an order of magnitude slower.
A waste of 8 bytes?
If we define `String` type as `{size_t len, size_t offset, char *data}`, then we can store up to 23 bytes directly in the struct, if we will sacrifice 1 bit of `len` field to indicate that.
7, since keeping track of the length allows you to skip storing the trailing 0.
Well technically that's implementation-defined, but yes.