@gc attribute for bypassign @nogc
Lodovico Giaretta via Digitalmars-d
digitalmars-d at puremagic.com
Thu Jul 28 00:12:06 PDT 2016
On Thursday, 28 July 2016 at 00:23:57 UTC, bitwise wrote:
> The point is though, that I WANT to use the GC. I want the
> memory cleaned up for me, and I don't mind little pauses once
> in a while. I just don't want careless allocations to happen in
> certain performance-sensitive contexts, like per-frame updates.
>
> While working on a past project(C++), I found this little gem:
>
> void draw() {
> Font* f = new Font("arial.ttf", 16);
> drawText(f, "hello world");
> }
>
> As utterly moronic as this seems, this was a real bug that I
> had to fix. Our game was literally topping out at 2GB of memory
> usage after ~30 seconds and crashing.
>
> Note: it wasn't my code ;)
>
> If that code was written in D with the feature I'm asking for,
> draw() would have been marked with @nogc. The person who wrote
> the above code would have either had to store the font
> somewhere else, or insert a @assumenogc{} section to actually
> do that. So it either would not have happened, or would have
> been much easier to find.
>
> If you found that your game/app was using too much GC,
> searching for "@assumenogc" would likely uncover the cause, as
> long as your root classes were annotated correctly. The
> @assumenogc annotation would plainly show where allocations
> were happening that maybe shouldn't be.
If @assumegc has to be manually checked to see if it is
over-allocating whenever the application is going out of memory,
then it is no more useful than running the gc-profiler when the
application is over-allocating. The profiler is even better,
because with @assumegc you have to check ALL marked functions to
find the leaking one, while the gc-profiler would just put it on
top of the report, making your job easier. So IMHO we already
have an instrument to solve these problems.
More information about the Digitalmars-d
mailing list