Une question simple, mais je n'ai pas trouvé de réponse définitive sur Stack Overflow.Une structure C# est-elle jamais encadrée lorsqu'elle est utilisée comme valeur de retour d'une fonction?
struct foo { int x; int y; int z; }
foo Func()
{
return new foo();
}
void Func2()
{
foo f = Func(); // did boxing and unboxing occur?
}
Est-ce une struct C# (type de valeur) toujours copiés à la pile lors du retour d'une fonction, peu importe la taille, il pourrait être? La raison pour laquelle je ne suis pas sûr est que pour certains jeux d'instructions autres que MSIL (tels que x86), une valeur de retour doit généralement entrer dans un registre de processeur, et la pile n'est pas directement impliquée.
Si oui, est-ce le site d'appel qui pré-alloue de l'espace sur la pile CLR pour le type de retour de valeur (attendue)?
[modifier: résumé des réponses:] Pour l'intention de la question initiale, la réponse est non; le CLR ne placera jamais (silencieusement) une structure juste dans le but de l'envoyer comme valeur de retour.
@Brian: merci, je le sais, mais je pense que vous dites que le processus de retour de la fonction elle-même n'implique aucune boxe. J'ai mis à jour le code pour clarifier la question. –
Super, merci pour vos réponses! –
Si un retour d'un type de valeur est toujours (votre utilisation de 'ever' semble impliquer que parfois, si cela arrive, ce n'est pas inconditionnel), cela signifie qu'il y a unboxing implicite lorsque nous assignons le retour à une variable de type valeur, et cela semble inefficace. Je ne sais pas grand-chose sur MSIL et CLR donc je ne peux pas vous aider ici. Quoi qu'il en soit, puis-je savoir ce qui a motivé votre question? – blizpasta