ufcpp/UfcppSample

managed address

Closed this issue · 2 comments

ufcpp commented

いつの間にか…
#413 (comment)

unsafe
{
    object o = new();
    object* ptr = &o;
}

https://twitter.com/ufcpp/status/1591427452932624386
roslyn/pull/64064 csharplang/pull/6453 で確かに…

「ref safety エラーの類を unsafe コンテキストでは警告だけにしよう」(csharplang/issues/6476)の話の一環っぽい感じではあるんだけど詳細不明。追えてない。

ufcpp commented

取れてるのはローカル変数のスタック上のアドレスっぽい。

using System.Runtime.CompilerServices;

unsafe
{
    string s = "abcd";
    object o = s;
    int i = 1;

    // 参照型変数への & は、ローカル変数の格納場所のアドレスっぽい。
    Console.WriteLine($"{(nint)(&o)} {(nint)(&i)}"); // &o は &i と並んでる

    // managed pointer 取りたいときはこう。
    var p1 = Unsafe.As<object, nint>(ref o);
    var p2 = (nint)Unsafe.AsPointer(ref Unsafe.AsRef(in s.GetPinnableReference()));
    Console.WriteLine($"{p1} {p2}");
    Console.WriteLine($"{p2 - p1}");
}