Como se puede saber, hay varios pasos de C# código al código nativo aquellos que son:
- Compilar desde C# para IL (código de bytes)
- JITting de bytecode a código nativo
C# no tiene ningún control de la hora en que se asigna la memoria, lo que se llama vinculante, todo depende de JIT. Al sacar esto del camino, veamos qué es en el control de C#. El código de bytes producido por C# debe cumplir el estándar CLR ECMA. Si vamos a la sección 12.1.6.1 de la Partición 1, veremos que la norma define que la casa de la variable local es en el encabezado del método. Como las firmas de métodos generalmente aparecen en el comienzo de un método en una lista, se obtiene una impresión (falsa) de que están vinculados por adelantado, lo que de hecho puede ser o no ser el caso.
Sin embargo, si está mirando el código nativo compilado, el resultado puede variar de una plataforma a otra. Históricamente, la asignación de espacio en la pila de la CPU para una variable local se realiza mediante una sola instrucción de la CPU de cambiar el puntero de la pila. Si desea hacerlo variable por variable, tendrá muchas instrucciones, una por variable, que es menos eficiente. Esta es la razón por la que, al menos en x86, verá que el espacio en la pila de la CPU se asigna por adelantado.
¿Por qué el ajuste del tamaño de la pila sería incrementalmente mejor que reservarlo todo por adelantado? – ildjarn
presumiblemente, lleva tiempo mezclar la pila ... si tengo muchas variables locales, ¿por qué esperar cuando no tengo que hacerlo (todavía)? – GWLlosa
Correcto, lleva un tiempo confundir la pila, por lo que hacerlo todo por adelantado en lugar de una y otra vez cada vez que una nueva variable ingresa al alcance es exactamente lo que se hace. – ildjarn