
Stewart, Robert wrote:
Andrey Semashev wrote:
Stewart, Robert wrote:
Beman Dawes wrote:
set, then there's no need for a null reference. Unfortunately, that has a performance downside: the function must be called and the temporary must be created or a reference to a global object must be created for all calls that use the default. A null pointer default must be cheaper. I think the performance cost of checking a reference or pointer for validity and checking some property in the error_code instance will be the same. After all, in both cases it comes down to a single comparison of two integers. Even if referencing the global default instance does add overhead, I bet it is negligible.
I wasn't referring to checking the reference or pointer. Rather, I was pointing out that the reference must be bound to something when the default is accepted. Every call using the default implies code that acquires an object or reference to one to which the formal parameter can be bound. That is costlier than simply passing a null pointer unless some compiler magic is involved.
The call to throws() can be inlined so that the global object acquisition turns into loading its address in a register. The address is known at compile time, so there's little difference between loading a zero into a pointer/reference argument and loading a valid address into a reference argument. No magic needed for this to happen.