On 9/28/14, 3:40 AM, Dmitry Olshansky wrote:
28-Sep-2014 00:16, Andrei Alexandrescu пишет: The key point is that the change is small, that's why (maybe) it's hard to grasp.
I think I get it now. It has a huge overlap with stuff that we already have. That doesn't bode very well!
The whole thing is a bit of lowering and a "hint" to the compiler. It reuses the same mechanism that structs already have. Okay a few examples of lowering to get things going: http://dpaste.dzfl.pl/3722d9d70937 (note I think there could be better lowerings and simpler set of primitives to bootstrap ARC-ed type) Now why would we need this trivial lowering? Typical postblit can be anything unless the compiler has full source code, dtor can be anything as well. With opInc/opDec compiler generates postblit/dtor on his own, in doing so it decorates user-defined dtor that actually clears resources. What being in control gives to the compiler: 1. Compiler always has the source of generated parts, so they can be inlined (and should be)
That's a given if the body of ctor/postblit/dtor is available. I don't see this as an important distinction.
2. Can do typical algebra optimization on opInc/opDec, no matter what's inside opInc and opDec (this is a contract between programmer and compiler). e.g opInc(10) followed by OpDec(1) is opInc(9)
That typical algebra optimization is already doable post inlining without a language feature. Compilers know integer arithmetic.
3. Also opInc and opDec do not alter object in any capacity, nor are they affected by any method calls on this object (another contract)
....?
4. 1 + 2 = win, as by inlining postblits/dtors we expose opInc/opDecs to the optimizer pass which the would fold them using basic algebra optimizations.
I don't think this is a feature worth adding. Andrei