Subject: [boost] [function] function wrapping with no exception safety guarantee
From: Daniel Walker (daniel.j.walker_at_[hidden])
Date: 2010-10-07 15:19:20
A few weeks ago, there was a request to remove boost::function's
dependency on boost::throw_exception when the user ensures that
boost::function is always initialized before attempting a call.
Providing an alternative invocation method in addition to the call
operator is an unattractive solution for many reasons; e.g.
boost::function would be less function-like syntacticly. Instead, why
not provide an alternative function wrapper with no exception safety
guarantee and no dependency on boost::throw_exception?
Thanks to Boost.Function's implementation design, which uses
preprocessor metaprogramming to generate many function wrappers with
different arities, it is simple to generate a function wrapper with no
exception safety guarantee. I have submitted a feature request with a
patch that implements boost::unsafe_function -- a function wrapper
with no exception safety guarantee -- along with tests and updated
unsafe_function's API and semantics are identical to boost::function
except that the behavior of operator() is undefined when
uninitialized. Also, swap, constructor and assignment operators have
been added to allow an unsafe_function to wrap the target of a
boost::function and vice versa.
unsafe_function is primarily useful in certain environments in which
exceptions and/or compiler optimizations are unavailable, such as some
embedded systems. On contemporary PC hardware, unsafe_function
typically would not have an advantage over boost::function. For
example, with object code generated by gcc -O2, I could only detect a
~1% difference between the two in terms of runtime costs using a
simple benchmark; i.e. less than a nanosecond. However, with -O1,
unsafe_function costs ~15% less than boost::function due to the lack
of overhead from the strong exception safety guarantee.
Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk