On 1/16/22 9:42 PM, forkit wrote:
On Monday, 17 January 2022 at 00:54:19 UTC, forkit wrote:
     // mArr2 is a dynamic array allocated on the gc heap
     // although compiling with '-profile=gc' incorrectly suggests otherwise.



if add @nogc to above code:
(8): Error: array literal in `@nogc` function `D main` may cause a GC allocation (22): Error: `@nogc` function `D main` cannot call non-@nogc function `std.array.array!(MapResult!(array, Chunks!(Result))).array`

Technically, this is using 2 different mechanisms.

@nogc is a function attribute that means it can't call other functions not marked as @nogc.

This is actually a *compile-time* mechanism. A call to `array` may not actually allocate, but *might* allocate, and therefore it's statically not allowed to be called from a @nogc function.

The profile=gc appears to only show GC allocations that the *compiler* initiates (i.e. via `new`, array operations (like appending) or closure allocations). It does not detect that the functions that actually allocate memory themselves (such as `core.memory.GC.malloc`) are GC allocations. This actually does not care whether a function might or might not allocate, but records when it actually does allocate.

-Steve

Reply via email to