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