[Development] Proposal: adding Q_DECL_NOEXCEPT to many methods
marius.storm-olsen at nokia.com
marius.storm-olsen at nokia.com
Thu Aug 2 21:47:46 CEST 2012
On 02/08/2012 14:25, ext marius.storm-olsen at nokia.com wrote:
> On 02/08/2012 12:55, ext Thiago Macieira wrote:
>> On quinta-feira, 2 de agosto de 2012 17.32.36,
>> marius.storm-olsen at nokia.com wrote:
>>> "the compiler can eliminate the mechanics of tracking the
>>> lifetime of certain unwindable objects in such a function, and
>>> significantly reduce the code size".
>>
>> That's in the caller.
>>
>> The problem is in the callee. The function that got the throw()
>> decoration gets more code to verify that it is not leaking any
>> exceptions.
>
> That doesn't make any sense, and certainly not in release builds,
> that you in a function marked as not going to throw an exception
> generate code to _really_ make sure you don't? And if that was the
> case, you certainly wouldn't proclaim that it "significantly reduces
> the code size", since you would increase the size of every callee
> marked as noexcept, only to save a little bit in the caller
> function.
I realize now that we have been talking past each other. You were
talking about the reasons for why "throw()" has been deprecated from the
standard
(http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2010/n3051.html),
while I was talking about MSVC's specific implementation
(http://msdn.microsoft.com/en-us/library/wfa0edys(v=vs.110).aspx).
They don't match.
"Visual C++ departs from the ANSI Standard in its implementation
of exception specifications." ... "If a function is marked with
throw(), the Visual C++ compiler will assume that the function
does not throw C++ exceptions and generate code accordingly." ...
"if a function does throw an exception, the program may not
execute correctly."
"It is the equivalent to using __declspec(nothrow)." ... (docs for
__declspec(nothrow)): "the compiler can eliminate the mechanics of
tracking the lifetime of certain unwindable objects *in* such a
function".
This tells me that MSVC's implementation of throw() == noexcept(true)
for all intents and purposes, and we can use that in Qt.
--
.marius
More information about the Development
mailing list