4 ms·
Can I disable GC on code which was written with the assumption that GC is enabled? (Honest question... I've never used D but I've heard about the GC being optio
by ninkendo 4y ago
Can I disable GC on code which was written with the assumption that GC is enabled? (Honest question... I've never used D but I've heard about the GC being optional before, and I'm skeptical.)
That is to say, if I want to use a third-party library, and that library was written to use the GC, and I want to _not_ use the GC, can I use said library? Or does using it require that I enable the GC for my code as well?
- WalterBright 4y agoYou can disable collections being run, but if the library uses the GC, then it uses the GC! (Lots of D users use a mix of GC and explicit allocation. Each has their best use cases.) May I ask what your concern is?
- danbolt 4y agoI can’t speak for the parent, but I know there are programs that avoid garbage collection due to pauses affecting the business logic. I think developers in those situations often look to C, C++, or Rust as any particular library you reach for isn’t going to be introducing GC into your program.
- WalterBright 4y agoThe D's GC collection cycle does pause, but it does not run unless the GC is asked to do an allocation. Hence, if you don't do GC allocations, or at least do not do them in your realtime loop, it will not pause. D is not a GC language. It's a language with an optional GC. (It also does not have the code gen compromises that fully GC languages rely on, such as write gates.)
- Kranar 4y agoAs much as people want to claim that you don't need to use the GC with D, in reality D is a garbage collected language and you do need to use a GC if you want to use D. As soon as you disable the GC in D, you end up with a really awkward to use language, no closures, no exceptions, no dynamic arrays, I think you can't even use the common string in D without the GC. People arguing that D can be used without a GC are just trying to sell you on something.
- nicwilson 4y ago> no exceptions There is a flag to allocate them with malloc, and use RC. > no dynamic arrays, I think you can't even use the common string in D without the GC. Totally not true. You can't concatenate arrays (string are just arrays of char) with `arr1 ~ arr2` and you can't `new` them, but you can do pretty much anything else. > People arguing that D can be used without a GC are just trying to sell you on something. Of course, but C++ people have an unnatural aversion to GC also the D GC only ever collects if you allocate from it. No allocations == no collections. For the most part, GC is a productivity enhancer, you can roll your own allocators, use malloc, etc. if you need to. You can statically ensure that some or all of your code doesn't use the GC and as expected there is a productivity/code maintenance price you pay for doing so.
- Kranar 4y agoYou can absolutely argue the benefits of a GC, and there are plenty of GC'd languages that as you say are great productivity enhancers. If anything, D should stop pretending that it doesn't have a GC and stop trying to appeal to people who don't want a GC, it's a losing battle. D should just accept the fact that it is a GC'd language and start making the argument for why it's a better GC'd language than Java or C# or the host of other GC'd languages. The vast majority of C++ developers do not want a GC'd version of C++, but it's possible that Java developers could be interested in a C++-like language that has a GC and good C compatibility.
- WalterBright 4y agoD is not a xxxx language. It enables programming in many diverse styles, styles that some languages are totally dedicated to (like Haskell is to functional programming). GC is just one of the styles. Yes, if you use "new" you get a GC allocation. But nobody makes you use "new". If you use the array concatenation operator, it uses the GC. But there are many ways to concatenate an array that don't use it. As for closures, they get allocated on the GC only if they escape the stack frame. This is detected, and if you want to be told about it, annotate the function with @nogc.
- 4y ago