Getting rid of unnecessary temporary objects in calculations? (Suggestion)

Kristian kjkilpi at gmail.com
Wed Oct 25 02:42:18 PDT 2006


On Wed, 25 Oct 2006 09:33:04 +0300, Don Clugston <dac at nospam.com.au> wrote:

> Kristian wrote:
>>  Lets consider the following:
>>  class Foo {
>>     Foo clone() {
>>         Foo ret = new Foo;
>>          ret.val = val;
>>          return(ret);
>>     }
>>      Foo opAdd(Foo Obj) {
>>         return(clone() += Obj);
>>     }
>>      Foo opAddAssign(Foo Obj) {
>>         val += Obj.val;
>>         return(this);
>>     }
>>      int val;
>> }
>>  Usually 'opXxx' and 'opXxxAssign' are closely related: 'a = a + b' <->  
>> 'a += b'. It would be very strange if that were not true.
>>  So, if a class has 'opXxx'/'opXxxAssign' it normally it has also  
>> 'opXxxAssign'/'opXxx', and a clone function.
>>  The compiler could then automatically generate 'opXxx' functions if a  
>> class has a standard clone operator, e.g. 'opClone'. Of course, you can  
>> easily mixin the 'opXxx' functions by yourself. But lets consider the  
>> following next:
>>      Foo a, b, c, d;
>>      a = b + c + d;
>>  A temporary object is created here two times. One should be sufficient.
>>  For example, you have a HugeMatrix class you use calculations, it gets  
>> cloned more than once, which is unnecessary. That can prevent operators  
>> to be used at all (too much time would be spend on cloning).
>>  What if compiler assumes that the 'opXxx' operators always return  
>> temporary objects? Then "a = b + c + d;" would be read as:
>>      a = b.opAdd(c).opAddAssign(d);
>>  That's efficient.
>>   Now, what if we get rid of the 'opXxx' operators altogether?
>>  If a class has 'opClone', then the class is treated as a value type:  
>> statements are compiled with the 'opClone' and 'opXxxAssignment'  
>> operators only. For example, "a = b + c + d;" will be read as:
>>      a = b.opClone().opAddAssign(c).opAddAssign(d);
>>  Then you could always use operators freely and there would be no  
>> redundant operator functions (e.g. 'opAdd' *and* 'opAddAssign'). Of  
>> course, that would also enforce 'a = a + b' <-> 'a += b' to be true  
>> always, but I think so it should be.
>>  And if there will be a copy/clone operator, lets say '<-', then
>>      a <- b;
>>     a <- b + c;
>>  would be, of course, read as:
>>      a <- b;     //== a = b.opClone();
>>     a = b + c;  //== a = b.opClone().opAddAssign(c);
>
> Take a look at:
>
> http://d.puremagic.com/bugzilla/show_bug.cgi?id=124

Heh, I should have quessed that this has been proposed before. :)

(Well, it didn't include the 'opClone' which could be useful. I actually  
continue this issue under a new post 'Suggestion: wrapping up value type  
objects' as I think it should have its own thread.)



More information about the Digitalmars-d mailing list