Una pregunta simple, pero no he encontrado una respuesta definitiva en Stack Overflow.¿Alguna vez se encasilla una estructura de C# cuando se usa como el valor de retorno de una función?
struct foo { int x; int y; int z; }
foo Func()
{
return new foo();
}
void Func2()
{
foo f = Func(); // did boxing and unboxing occur?
}
Es una estructura de C# (tipo de valor) siempre copian en la pila cuando devueltas por una función, no importa lo grande que podría ser? La razón por la que no estoy seguro es que para algunos conjuntos de instrucciones que no sean MSIL (como x86), un valor de retorno por lo general debe caber en un registro de procesador, y la pila no está directamente involucrada.
En caso afirmativo, ¿es el sitio de llamadas el que preasigna espacio en la pila CLR para el tipo de valor devuelto (esperado)?
[Editar: resumen de respuestas:] Para el propósito de la pregunta original, la respuesta es no; el CLR nunca (silenciosamente) encajonará una estructura solo con el propósito de enviarla como un valor de retorno.
@Brian: gracias, me doy cuenta de eso, pero creo que estás diciendo que el proceso de devolverlo desde la función en sí no implica ningún boxeo. He actualizado el código para aclarar la pregunta. –
Genial, gracias por tus respuestas! –
Si la devolución de un tipo de valor es alguna vez (su uso de "alguna vez" parece implicar que, a veces, si sucede, no es incondicional), significará que hay unboxing implícito cuando asignamos el retorno a una variable de tipo de valor, y eso parece ineficiente. No sé mucho sobre MSIL y CLR, así que no puedo ayudarte aquí. De todos modos, ¿puedo saber qué provocó tu pregunta? – blizpasta