Re: goto... is it so bad?
On 29 Mar, 06:22, Walter Bright <wal...@digitalmars-nospamm.com>
wrote:
Vladimir Marko wrote:
On 28 Mar, 02:02, Walter Bright <wal...@digitalmars-nospamm.com>
wrote:
I'd prefer
SCOPE(exit) foo.Finish;
where SCOPE is a properly defined macro -- I'm not calling
foo.Finish() now, I'm just scheduling the function object for
delayed invocation. Unfortunately, closures cannot be formed
as object.member_function in C++.
Right - it doesn't work in C++. And if you find you have to use macros
to invent syntactical constructs, well, those kind of things always make
me uneasy.
The other option is to add a new keyword and I don't like that
at all. Why adding to core language if we can implement it as
a library?
scope(success) s;
=> int x=0; try { ... } catch (o) { x = 1; throw o; } finally { if (!x) s; }
What about
{ ...; scope(success) expression; ...; }
=>
{ ...; ...; expression; }
My favorite solution for this is actually the scope guard
statement:http://www.digitalmars.com/d/exception-safe.html
invented by Andrei Alexandrescu and Petru Marginean
Is this not RAII? Is my definition of "resource" much broader
than yours?
It isn't RAII any more than try-finally is RAII.
Apparently, you didn't get my point. Every single ScopeGuard takes
ownership of "resources" allocated for some kind of "transaction".
Thus, ScopeGuard is a RAII tool by definition. My definition.
You're right, I didn't get your point. But I don't agree with your
definition because it tries to redefine the problem in a way that
doesn't help.
I may be generalising a little but I'm not redifining anything.
For example the article http://www.ddj.com/dept/cpp/184403758
uses ScopeGuard for resources exclusively.
BTW, the scope guard statement is implemented internally in the compiler
by transforming it into a combination of try-catch-finally statements.
So are RAII objects.
Compiler implementation details should not any have impact on
the application code.
I'm no fan of SESE. It's always been PITA when I used it.
IMO, with goto you pretend to use the SESE while actually
having multiple returns.
You could look at it that way. But there is another, subtler reason I do
it. With most CPUs, faster code is the branch not taken. So I'll use
gotos to get the uncommon cases out of the direct control flow.
Sometimes the result isn't the prettiest, but when you feel the need for
speed..
Do you have any evidence that it's better than profiler-guided
optimization? RAII objects break that "branch not taken" making
this micro-optimization useless to me anyway. YMMV since you are
declaring most varibles at the beginning of a function.
Regards
Vladimir Marko
--
[ See http://www.gotw.ca/resources/clcm.htm for info about ]
[ comp.lang.c++.moderated. First time posters: Do this! ]