@gc attribute for bypassign @nogc
bitwise via Digitalmars-d
digitalmars-d at puremagic.com
Thu Jul 28 13:26:26 PDT 2016
On Thursday, 28 July 2016 at 16:58:14 UTC, default0 wrote:
> On Thursday, 28 July 2016 at 16:45:05 UTC, bitwise wrote:
>> On Thursday, 28 July 2016 at 16:15:04 UTC, Guillaume Piolat
>> wrote:
>>> On Thursday, 28 July 2016 at 15:24:10 UTC, bitwise wrote:
>>>>
>>>> It's not about running out of memory. It's a performance
>>>> issue.
>>>>
>>>> Example: In the following class, it would be perfectly fine,
>>>> and even expected to allocate in start() but not in
>>>> update(). This is because start() gets called once on object
>>>> initialization, but update() would get called every frame.
>>>>
>>>
>>> Vladimir implemented counting in -profile=gc, it gives you
>>> the number of allocations and the amount allocated for each
>>> allocation point.
>>
>> I'm not sure if this point is meant to be for or against what
>> I'm suggesting, but still, I'm thinking in terms of
>> *proactively* writing efficient code, not allowing an app get
>> to the point where you need to run a profiler.
>>
>> The situation is similar to using @safe. You *could* just
>> write code however you want, wait until it crashes, then try
>> to find the problem using Valgrind or something, but that's
>> bad for obvious reasons.
>>
>> Bit
>
> Just my 2 cents on naming: what you want sounds a lot more like
> @warngc than @assumenogc or whatever was floating around
> before. What such an attribute should do and if its worth
> implementing is hard to figure out, though. Presumably you'd
> have your update() method marked @warngc but then how is the
> compiler supposed to know that an allocation like this:
>
> class A {
> void update() @warngc {
> if(rareCondition()) {
> // something that allocates
> }
> }
> }
>
> is perfectly fine, but something like this
>
> class B {
> void update() @warngc {
> if(almostAlwaysTrue()) {
> // something that allocates
> }
> }
> }
>
> is not?
> That issue aside, what exactly do you envision the compiler to
> tell you (examples of error messages and code patterns it
> should detect, examples of code patterns that it should NOT
> detect and are fine) incase it automagically finds problematic
> code?
>
> I'm having trouble putting a thumb on what you want following
> this thread, because what you are describing feels a bit vague
> to me.
I think you're complicating the issue quite a bit here.
It's very simple:
@nogc { /* in this scope, compiler disallows GC allocations. */ }
@nogc {
@assumenogc { /* here, GC allocations are allowed */ }
}
@assumenogc would simply reverse the effects of the @nogc flag on
a given scope.
So @nogc could be applied to performance critical scopes, as it
is now. The exception would be, that if I as a programmer knew
that I was only making a small one-time allocation, and that the
GC was still enabled, I could do so by surrounding the allocation
with @assumenogc.
Bit
More information about the Digitalmars-d
mailing list