[cfe-dev] Can noexcept impair performance?
Stephan Tolksdorf
st at quanttec.com
Fri Feb 15 05:58:12 PST 2013
On 2013-02-11, John McCall wrote:
> On Feb 10, 2013, at 7:11 AM, Stephan Tolksdorf <st at quanttec.com> wrote:
[...]
>> I wonder whether there are also situations where a noexcept declaration could impair performance. For example, I could imagine that a noexcept declaration might complicate or even suppress inlining if the compiler can't prove that the function code can never throw. Could this happen with Clang?
>
> Exception specifications can impair performance in two ways:
> 1. Exception specifications are required to be enforced, so if a noexcept function calls anything that isn't noexcept, the compiler has to emit exception tables and handlers to ensure that std::terminate is called, increasing code size. (GCC-compatible personality functions support an abbreviation for this handler so that, in theory, the compiler need not use an actual landing pad. However, clang does not currently take advantage of this.)
Thank you for the explanation!
Would it be correct to state that it's the job of LLVM's PruneEH pass
(which runs before the inliner) to remove the exception handling
overhead associated with a function exception specifications if it
detects in a bottom-up traversal of the call-graph that the function can
not throw an exception?
> 2. When an operator new is noexcept, new expressions are required to check whether the result is null before calling the constructor. This introduces an extra branch on every allocation. Sadly, this applies even to the special global placement operator new.
Requiring a low-level primitive like placement new to do an implicit
null check indeed seems to be unnecessarily inefficient. If you wanted
the null check, you could easily perform it yourself before calling
placement new.
- Stephan
More information about the cfe-dev
mailing list