Comment by foldr
5 months ago
>I'd rather have my resource management verified at compile time and with no runtime overhead
Malloc and free have runtime overhead — sometimes more than the overhead of garbage collection.
The only way to have no overhead is to statically allocate fixed sized buffers for everything.
malloc and free aren't overhead.
If I'm reading a file, then opening and closing a file is not overhead either. But if I'm reading a file and some convoluted system in my own process is slapping some 3000% extra work on top because it needs to asynchronously track opened files and close them at arbitrary time later - that is overhead and creates bugs.
Which is one reason why many GC languages end up with bad emulations of an almost overhead free pattern like "try-with-resources" in Java and "IDisposable" in C# etc.
It is not correct to think of garbage collection as malloc + free + GC overhead. For example, allocating memory is much faster in many GC designs than a call to malloc (it can just be a pointer bump on the fast path).
I think you are assuming that a garbage collector calls malloc and free and then does a bunch of additional work on top of that to keep track of memory allocations, but that's not really how it works.