Am 10.04.2016 um 13:06 schrieb Maciej Izak: > Hi, > > Sven proposed that we need to discuss AddRef operator (important part of > smart pointers implementation). > > AddRef is used when record is passed as parameter to method/function by value > (for records to large > to copy (only the address is pushed)). AddRef is used also for dynamic array > operations (temporary > for SetLength operation and for Copy operation for already copied data by > move). > > AddRef is much faster than Copy (all data already exist, so we don't need to > copy anything). AddRef > is used to increment ref count for managed types. > > IMO the best solution is to implement two operators: > > class operator AddRef(var aFoo: TFoo); > class operator Copy(constref aSrc: TFoo; var aDst: TFoo); > > also is possible to implement single operator: > > class operator Copy(aSrc: PFoo; var aDst: TFoo); > > aSrc in that case can be nil (for AddRef operation). Anyway that is inelegant > solution... > > Any other solution means big performance loss for RTL operations for dynamic > arrays. >
I think this is the wrong way: - AddRef means only to increase the ref. count of the passed data structure - Copy is no deep copy, it means only: copy the current data structure, if it references managed types, their ref. count is increased but they are not copied Example with dyn. arrays: - AddRef increases the ref. count of the passed array, not its members - Copy creates a copy of the array, if the members of the array are managed, their ref. count is increased So I would call the operator Copy, in case of custom implemented ref. counted records, this would be an AddRef operation. For a real copy, a procedure like Clone should be declared. _______________________________________________ fpc-devel maillist - [email protected] http://lists.freepascal.org/cgi-bin/mailman/listinfo/fpc-devel
