On Friday, 27 September 2013 at 15:22:14 UTC, H. S. Teoh wrote:
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().

I think strings are an actual exception to this rule, what with being immutable and all (provided you place the info in a string of course "char[] ss = s" will allocate of course).

All other types, even immutable (AFAIK) will allocate though, yes.

Reply via email to