On 08-10-2013 20:38, Daniel James wrote:
On 8 October 2013 02:09, Rob Stewart
wrote:
There's no need to check for null, so there's no need to risk pipeline stalling on a failed branch prediction or cache invalidation due to the exception construction and throwing code you'd add to the ctor otherwise.
Well, there's premature optimization for you.
This is a class that's concerned with safety, not efficiency. If there's a safe option and an unsafe option, then the safe option should be the default, and the unsafe option should be the verbose one.
This is an important point. There is virtually no overhead of validating the invariant. Why? Because the heap-allocation is going to dwarf the validation. The cost of the validation will be regained quickly because we do not need to check for null every time we access the pointer. OTOH, if std::vector<T>::front() validated it's precondition, it would have a noticable runtime overhead. Different situations. If it's cheap or free to avoid UB, why not do it? -Thorsten