On Wednesday, November 06, 2013 07:26:57 qznc wrote: > On Wednesday, 6 November 2013 at 04:57:57 UTC, Jonathan M Davis > > wrote: > > On Tuesday, November 05, 2013 13:27:54 Jacob Carlborg wrote: > >> On 2013-11-05 12:16, Meta wrote: > >> > One gotcha relates to enums. Writing `enum a = [0, 1, 2]` is > >> > a really > >> > bad idea, because everywhere you use a, it constructs a new > >> > array at > >> > runtime. The [0, 1, 2] is "pasted in", and you'll have a > >> > bunch of > >> > allocations you didn't expect. This doesn't just happen with > >> > arrays, but > >> > that's the most common case. What *is* okay is using string > >> > enums, as > >> > strings are a bit special due to being immutable. > >> > >> Isn't the problem rather that [0, 1, 2] allocates in the first > >> place, > >> regardless if an enum is used or not. > > > > In most cases, array literals need to allocate, regardless of > > whether they're > > an enum or not. The cases where they don't need to allocate > > (e.g. when > > initializing a static array) shouldn't allocate, but an array > > literal by > > itself is a dynamic array, and pretty much has to allocate in > > most cases in > > order to be safe. Having an enum which is an array literal > > rather than making > > it an immutable constant then results in allocations that you > > might not want, > > but that's not really the literal's fault. > > Can you work around that? Maybe something like: > > enum a = immutable([0, 1, 2]);
What's to work around? It's very much on purpose that enums work that way. If you don't want that behavior, then simply create a variable instead. e.g. immutable a = [0, 1, 2]; The fact that enums are treated as manifest constants isn't a problem so long as you understand that that's what they're supposed to do. If you don't want a manifest constant, then don't use an enum. The only thing that enum a = [0, 1, 2]; gains you over immutable a = [0, 1, 2]; is making it a manifest constant instead of a variable. Which you choose depends on what behavior you want. Neither is wrong, and which is desirable depends entirely on what you're doing. - Jonathan M Davis
