Упаковывалась ли структура C # в коробку, когда она использовалась в качестве возвращаемого значения функции?

Простой вопрос, но я не нашел окончательного ответа на Stack Overflow.

    struct foo { int x; int y; int z; }

    foo Func()
    {
        return new foo();
    }
    void Func2()
    {
        foo f = Func();     // did boxing and unboxing occur?
    }

Всегда ли структура C # (тип значения) копируется в стек при возврате из функции, независимо от ее размера? Причина, по которой я не уверен, заключается в том, что для некоторых наборов инструкций, отличных от MSIL (например, x86), возвращаемое значение обычно должно соответствовать регистру процессора, а стек напрямую не задействован.

Если да, то это сайт вызова, который предварительно выделяет место в стеке CLR для (ожидаемого) типа возвращаемого значения?

Я нашел окончательный ответ на Stack Overflow.

    struct foo { int x; int y; int z; }

    foo Func()
    {
        return new foo();
    }
    void Func2()
    {
        foo f = Func();     // did boxing and unboxing occur?
    }

Всегда ли структура C # (тип значения) копируется в стек при возврате из функции, независимо от ее размера? Причина, по которой я не уверен, заключается в том, что для некоторых наборов инструкций, отличных от MSIL (например, x86), возвращаемое значение обычно должно соответствовать регистру процессора, а стек напрямую не задействован.

Если да, то это сайт вызова, который предварительно выделяет место в стеке CLR для (ожидаемого) типа возвращаемого значения?

Я нашел окончательный ответ на Stack Overflow.

    struct foo { int x; int y; int z; }

    foo Func()
    {
        return new foo();
    }
    void Func2()
    {
        foo f = Func();     // did boxing and unboxing occur?
    }

Всегда ли структура C # (тип значения) копируется в стек при возврате из функции, независимо от ее размера? Причина, по которой я не уверен, заключается в том, что для некоторых наборов инструкций, отличных от MSIL (например, x86), возвращаемое значение обычно должно соответствовать регистру процессора, а стек напрямую не задействован.

Если да, то это сайт вызова, который предварительно выделяет место в стеке CLR для (ожидаемого) типа возвращаемого значения?

[править: сводка ответов:] Для целей исходного вопроса ответ отрицательный; CLR никогда не будет (молча) упаковать структуру только с целью ее отправки в качестве возвращаемого значения.

8
задан Glenn Slayden 17 August 2011 в 18:02
поделиться