Cannot compare object.opEquals is not nogc

Jonathan Marler via Digitalmars-d-learn digitalmars-d-learn at puremagic.com
Sun Jul 24 07:54:11 PDT 2016


On Sunday, 24 July 2016 at 09:03:04 UTC, Lodovico Giaretta wrote:
> On Sunday, 24 July 2016 at 02:17:27 UTC, Rufus Smith wrote:
>> [...]
>
> Now you are telling me to "program by trust", because there's 
> nothing ensuring that I remember to free everything I allocated 
> with malloc/free, while a GC would guarantee no memory leaks. 
> Again there's nothing stopping me from returning pointers to 
> things allocated on the stack. And now there are lots...
> Before you told me that programming by trust is a wrong 
> attitude, and now you propose me to use it, risking memory 
> leakage in a function that may be executed hundreds of times 
> per second.
>
>> [...]
>
> No. If you put a big @nogc attribute on Object.opXXX, then 
> nobody can write GC code in his classes. So if everything is 
> @nogc, you cannont write GC code, because it woudn't interact 
> with Phobos. Example: if you mark an algorithm that takes a 
> delegate @nogc, then you cannot pass GC delegates to it. So you 
> cannot use it in GC code.
>
>> [...]
>
> Yes. All building blocks must be as much @nogc as possible. But 
> customization points (virtual functions, delegate arguments, 
> ...) must not be @nogc, otherwise it is no possible to have 
> classes that use the GC or callbacks that use the GC.
>
>> [...]
>
> I still don't understand why you want Object.opXXX @nogc. As I 
> already said, you can still make your functions @nogc, just 
> accepting parameters of @nogc types. It's obvious. If I wrote a 
> wonderful library that uses the GC, you will not use it. If I 
> have a class that uses the GC in opXXX (and I am free to have 
> it, because maybe I need it, and maybe it's the most efficient 
> way for my use case), you will not use it. The same applies 
> here. You'll have your algorithms work only on classes that 
> declare opXXX as @nogc.
>
> Not all memory allocation patterns are good for malloc/free. 
> Not all of them are good for stack allocations. Some of them 
> are not even good for reference counting. Every class shall use 
> the best solution for its job. And everybody must still be able 
> to extend the base class.
> If you want to use a method specific to a subclass, you 
> downcast. If you want to use the @nogc opXXX when the base does 
> not enforce it, you downcast. It's the same principle: more 
> advanced functionalities require more derived types (and @nogc 
> is more derived, because it is covariant to not- at nogc). Basic 
> OOP.

I believe Rufus was only referring to the virtual methods defined 
in the object class.  That would be:

toHash (Note: this is already nothrow, that's intersting and 
quite restrictive)
opCmp
opEquals

I think all 3 of these are good candidates for @nogc.  However, 
AFAIK, making them @nogc would break any code that implements 
them because they would have to add the @nogc attribute to their 
implementations (unless I am mistaken?  Do subclass overrides 
need to explicitly have @nogc if the parent class does?).  If 
adding @nogc is not required in the implementation, then the only 
code that would break would be implementations that actually do 
allocate GC memory.

Some would think that restricting GC usage inside these virtual 
methods is a good thing because it has the benefit of 
discouraging memory allocation for these types of operations.  
Really, you probably shouldn't be allocating memory to perform a 
comparison.  If you really need to, you can either allocate non 
GC memory, or use a different mechanism then the opCmp/opEquals 
methods.


More information about the Digitalmars-d-learn mailing list