== Quote from bearophile (bearophileh...@lycos.com)'s article > Dmitry Olshansky: > > As stated in this proposal they are quite useless, e.g. they are easily > > implemented via mixin with alloca. > Thank you for your comments. Here I have added some answers to your comments: > http://d.puremagic.com/issues/show_bug.cgi?id=5348 > Bye, > bearophile
Some thoughts to your proposal: > void bar(int len) { > Foo* ptr = cast(Foo*)alloca(len * Foo.sizeof); > if (ptr == null) > throw new Exception("alloca failed"); > Foo[] arr = ptr[0 .. len]; > foreach (ref item; arr) > item = Foo.init; > > // some code here > writeln(arr); > > foreach (ref item; arr) > item.__dtor(); > } 1) Why call the dtors manually? Forgive me if I'm wrong, but iirc, alloca will free the memory when the stack exits from the current frame level. :) 2) The GCC implementation is roughly equivalent to this: { size_t len; void * saved_stack; int[len] * arr.2; int arr[len] [value-expr: *arr.2]; saved_stack = __builtin_stack_save (); try { arr.2 = (int[len] *) __builtin_alloca (len * 4); } finally { __builtin_stack_restore (saved_stack); } } And any interaction with the VLA is done within the try block. Being a very biased person, in an imaginary D implementation I'd favour some similar sort of behaviour. :o)