On Thursday, 19 February 2015 at 01:39:19 UTC, Jonathan Marler wrote:
On Wednesday, 18 February 2015 at 23:49:26 UTC, Adam D. Ruppe wrote:
I'd write a foo_impl which always takes a parameter. Then do the versioned foo() functions which just forward to it:

void foo_impl(int x) { long function using x here }

version(globals) {
  int x;
  void foo() {
     foo_impl(x);
  }
} else {
  void foo(int x) { foo_impl(x); }
}

Minimal duplication with both interfaces.

That kinda defeats the purpose of why I want this. It's for performance reasons. I need one version to have NO arguments and one version to have one ref argument.

If it's a `ref` argument (your original example doesn't have one), are you sure there will be a performance problem?

Anyway, how about using a template and an alias, respectively:

    void foo_impl(ref ExpensiveStruct x) { ... }

    version(globals) {
        ExpensiveStruct x;
        void foo()() {
            foo_impl(x);
        }
    } else {
        alias foo = foo_impl;
    }

That way, you'd force `foo` to be instantiated at the call site, making it more likely to be inlinable. In the non-global case, there will be no overhead at all because of the `alias`.

But, as always for things related to performance: profile first, then optimize.

Reply via email to