On Thursday, 7 February 2013 at 21:32:28 UTC, Jonathan M Davis wrote:
On Thursday, February 07, 2013 21:46:21 Maxim Fomin wrote:
So, you want to call function (which throws) from function marked
as nothrow? It seems to be breaking idea of what nothrow does.

I believe that the problem is that the function isn't marked nothrow even though it doesn't throw. He essentially wants to be able to make the compiler treat it as nothrow at the call site (since he can't change the function definition) without any overhead, and I don't think that that's actually
possible.

I was though able to get a function pointer, and cast said pointer, at compile time (place it an enum). At that point, calling the function via the compile-time known pointer *should* be just as efficient as calling the function directly. I'll need to check the assembly.

EG:

//----
import std.stdio;

void bar()
{writeln("bar");}

void foo() nothrow
{
    enum barnothrow = cast(void function() nothrow)(&bar);
    barnothrow();
}

void main()
{foo();}
//----

Yes, writeln actually can throw, so it's a bad example, but a proof. I'd be surprised if there was any run-time overhead (but I could be wrong).

In my case though, there is an extra overhead that I can't get a function pointer to dup, so I have to create an intermediary function. Depending on the inlined-ness of things, *that* may or may not incur an overhead.

The normal way to handle cases where you know that a function won't throw but isn't nothrow is to wrap it in a try block and put an assert(0) statement in the catch block. That does incur some amound of overhead, but I don't know how much. Apparently, monarch_dodra thinks that it's too much for what he's doing
though.

- Jonathan M Davis

Well, I don't think it's too much, but wanted to know the alternatives. I like to know my options, and their costs. It costs nothing to ask, and you never know what you'll learn.

I think the conclusion I came to though is to bite the bullet, and not worry too about it.

Thank you for your answers anyways.

Reply via email to