enum arrays are created for every use
Jonathan M Davis
jmdavisProg at gmx.com
Mon Jun 4 18:27:14 PDT 2012
On Monday, June 04, 2012 18:12:57 Ali Çehreli wrote:
> (Influenced by a discussion in the main D newsgroup.)
>
> The assert check in the following program passes, indicating that 'a' is
> not 'a'! :p
>
> enum a = [ 1, 2 ];
>
> void main()
> {
> assert(a.ptr != a.ptr);
> }
>
> Apparently this is due to enum arrays being created every time they are
> used. What is the rationale for this? Is this a limitation of the
> language, dmd, linker?
>
> Surprisingly, it is not surprising ;) when it is a character array:
>
> enum a = "hello";
>
> void main()
> {
> assert(a.ptr == a.ptr); // <-- this time equals
> }
>
> I remember reading similar issues with associative arrays. Is that still
> the case? What are the rules for using enum vs. immutable? Should we use
> 'enum' for value types but 'immutable' for reference types? (Which is
> clearly not a good guideline, given the "hello" example above).
This is how manifest constants work. They don't actually exist. They're copy-
pasted everywhere that they're used. If you want an actual variable rather
than a manifest constant, then you declare a variable (and make it const or
immutable if you want a constant). The side effect of this for something like
an array is that you end up with a new array everywhere that it's used rather
than a slice of the original (since there is no original), which can effect a
negative effect on performance if you aren't expecting all of those additional
heap allocations.
- Jonathan M Davis
More information about the Digitalmars-d-learn
mailing list