Proste pytanie, ale nie znalazłem ostatecznej odpowiedzi na przepełnienie stosu.Czy struktura C# jest kiedykolwiek zapakowana w ramkę, gdy jest używana jako wartość zwracana przez funkcję?
struct foo { int x; int y; int z; }
foo Func()
{
return new foo();
}
void Func2()
{
foo f = Func(); // did boxing and unboxing occur?
}
Czy C# struct (typ wartości) zawsze kopiowane do stosu po powrocie z funkcji, bez względu na to, jak duży może być? Powodem, dla którego nie jestem pewien, jest to, że dla niektórych zestawów instrukcji innych niż MSIL (takich jak x86), wartość zwracana zwykle musi pasować do rejestru procesora, a stos nie jest bezpośrednio zaangażowany.
Jeśli tak, to czy witryna wywoławcza wstępnie alokuje miejsce na stosie CLR dla oczekiwanego typu zwracanej wartości?
[edytuj: podsumowanie odpowiedzi:] Dla zamysłu pierwotnego pytania odpowiedź brzmi: nie; CLR nigdy (po cichu) nie będzie umieszczał struktury w celu wysłania jej jako wartości zwracanej.
@Brian: dziękuję, zdaję sobie z tego sprawę, ale myślę, że mówisz, że proces zwrotu z samej funkcji nie wiąże się z boksowaniem. Zaktualizowałem kod, aby pytanie było jaśniejsze. –
Świetnie, dzięki za odpowiedzi! –
Jeśli powrót typu wartości jest kiedykolwiek (twoje użycie "kiedykolwiek" zdaje się sugerować, że czasami, jeśli to się zdarza, to nie jest bezwarunkowe) w pudełku, będzie to oznaczać, że istnieje niejawne rozpakowanie, gdy przypiszemy powrót do zmiennej typu wartości, i to wydaje się nieskuteczne. Nie wiem prawie nic o MSIL i CLR, więc nie mogę ci tu pomóc. W każdym razie, czy mogę wiedzieć, co skłoniło cię do postawienia pytania? – blizpasta