On 9/23/21 12:58 PM, eugene wrote:
On Thursday, 23 September 2021 at 15:56:16 UTC, Steven Schveighoffer wrote:
See more details:
https://docs.microsoft.com/en-us/dotnet/api/system.gc.keepalive?view=net-5.0#remarks
"
This method references the obj parameter, making that object ineligible
for garbage collection from the start of the routine to the point, in
execution order, where this method is called. Code this method at the
end, not the beginning, of the range of instructions where obj must be
available.
"
**Code this method at the end...**
:)
it is the same as proposed by jfondren simple
writeln(stopper.sg0.number) in the end of main, right?
Same effect, but writeln actually executes code to write data to the
console, whereas KeepAlive doesn't do anything.
Essentially, you get the side effect of keeping the object as live,
without paying the penalty of inserting frivolous code.
All my efforts to achieve the same via a library were thwarted by at
least LDC (whose optimizer is very good).
The only possible solution I can think of is to generate an opaque
function that LDC cannot see into, in order to force it to avoid
inlining, and have that function do nothing.
However, there's always Link-Time-Optmization...
-Steve