On Fri, Sep 27, 2013 at 04:52:20PM +0200, JR wrote:
> On Friday, 27 September 2013 at 14:37:05 UTC, Dmitry Olshansky
> wrote:
> >27-Sep-2013 02:00, JR пишет:
> 
> >And the answer is - don't use ENUM with ctRegex.  The problem is that
> >ctRegex returns you a pack of datastructures (=arrays).  Using them
> >with enum makes it behave as if you pasted them as array literals and
> >these do allocate each time.
> >
> >TL;DR: use static and/or auto with ctRegex not enum.
> 
> That fixed it. Thank you both for your help!
> 
> 
> (I was of the notion that that enum merely translate to
> compile-time-evaluated constants.)

It does do that, yes. But the semantics aren't *quite* what one might
expect (I was a victim of this misconception too :-P). What it does is
to, in effect, "copy-n-paste" the value of the enum into whatever code
uses it, every time. That means that if you write:

        enum x = "abc";
        void fun() { auto y = x; }
        void gun() { auto z = x; }

It will *copy* "abc" into y and z (rather than just aliasing the same
underlying string), *each time* you call fun() and gun().

TL;DR: use immutable instead of enum for array-based constants:

        immutable x = "abc";
        void fun() { auto y = x; } // now y is just an alias of x
        void gun() { auto z = x; } // now z is just an alias of x


T

-- 
Debian GNU/Linux: Cray on your desktop.

Reply via email to