Pregunta

Esta podría ser una pregunta bastante sencilla, pero estoy tratando de entender algunos de los trabajos internos de la compilación.

En pocas palabras, imagine un objeto arbitrario siendo instanciado. Este objeto luego se asigna en el montón. El objeto tiene una propiedad de tipo PointF (que es un tipo de valor), con un método get y set.

Imagine que el método get y set contiene algunos cálculos para hacer su trabajo. ¿Cómo y dónde (stack / heap) y cuándo se instancia este código?


Este es el trasfondo de esta pregunta:

Estoy escribiendo métodos get y set para un objeto y es necesario acceder a estos métodos con mucha frecuencia. El código get y set en sí mismo es bastante masivo, por lo que temí que en el peor de los casos los métodos se instanciarían como un objeto o un tipo de valor con todo el código interno para cada acceso de la propiedad. Por otro lado, el código probablemente se instancia cuando se crea el objeto principal y simplemente se le dice a la CPU que salte al inicio del código de propiedad. De todos modos, esto es lo que quiero aclarar.

¿Fue útil?

Solución

Los métodos (o propiedades) no se instancian. Parece que está pensando de la manera en que lo hice una vez: crear una instancia de una clase no solo asigna espacio para los datos, sino también para el código. Esto no es cierto.

Incluso en C ++, la forma en que esto funcionaría es que los datos se asignarían, junto con un puntero a una matriz de punteros de función: la Tabla de funciones virtuales o vtable. Las entradas en vtable apuntarían a métodos virtuales. Los métodos no virtuales no necesitarían una entrada en la tabla vtable.

En cualquier caso, solo había una copia del código, independientemente de cuántos objetos se instanciaran.

Otros consejos

No tengo mi copia de CLR a través de C # aquí con yo, pero los captadores y establecedores de propiedades son solo métodos en la clase con una decoración especial. El excelente libro de Jeffery Richter tendrá todos los detalles esenciales.

El código ejecutable no está asignado en la pila ni en el montón, el JIT'er lo compila cuando es necesario y la memoria correspondiente se reserva una vez . Es decir, te preocupa lo que esencialmente no es un problema. Además, no intente adivinar qué hace el recolector de basura con respecto a la asignación de memoria: está ahí para quitarle esa preocupación.

No son diferentes de los métodos.

No estoy seguro de qué quieres decir con instanciado, pero si te preocupa el tiempo de ejecución del captador, puedes pensar en almacenar en caché la respuesta. Sin embargo, no haría eso hasta que haya verificado que el getter realmente perjudica el rendimiento de su programa.

De acuerdo con esta página en MSDN tiene propiedades y métodos Algunas diferencias esenciales. Especialmente cuando se trata de devolver matrices, las propiedades realizan una copia superficial de toda la matriz antes de devolverla, por lo que es una situación en la que desea utilizar una función personalizada en su lugar.

Sin embargo, como expliqué anteriormente, quería saber si el programa sufriría una penalización de rendimiento si usara propiedades en lugar de funciones de alguna manera. En general, descubrí que las propiedades son en promedio un 5% más lentas que las funciones por alguna razón inexplicable. Podría deberse a que las propiedades cuentan con un rango completo de "invisible" objetos tales como descriptores de propiedades y similares. Además de eso, las implementaciones parecen ser bastante similares.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top