Does that mean that protected (not protected var) parameters are passed by value? Especially in the case of large structures, can this be inefficient, taking up stack space and consuming time to copy the arguments?
Yes. :-(
Or does the standard prescribe something different?
Yes. It requires that the value of the protected formal parameter cannot change during the execution of the function,
The standard doesn't define it this way. I too think that protected should be treated exactly like var parameters, or whatever is as efficient or more efficient (that's why I use const parameters for in Borland Delphi).
The standard says this about protected parameters: