Pregunta

Yo estaba leyendo algunos artículos sobre neta con respecto a los procesadores sencillos VTABLE y leí en alguna parte que los procesadores sencillos se pueden utilizar para conectar procedimientos / cadena de llamadas.

¿Es alcanzable?

¿Alguien sabe cómo funciona, también yo no soy capaz de encontrar buenos recursos explicar procesadores. ¿Alguna sugerencia para que?

¿Fue útil?

Solución

La implementación de un golpe seco en bruto en el estilo de procesadores v-mesa es un último recurso. Lo que usted necesita para lograr más probable es que puede lograrse con una función de contenedor, y será mucho menos doloroso.

En general, un procesador realiza lo siguiente:

  1. Fijar hasta los parámetros de entrada (por ejemplo, convertir a un formato diferente)
  2. Llame a la aplicación real
  3. Limpiar el paso 1 / fijar los parámetros de salida

Para ver un ejemplo de cómo funciona, vamos a pasar a nuestro buen amigo Raymond Chen y su discusión de procesadores de ajuste:

http://blogs.msdn.com/oldnewthing /archive/2004/02/06/68695.aspx

El golpe seco que utilizó fue la siguiente:

[thunk]:CSample::QueryInterface`adjustor{4}':
  sub     DWORD PTR [esp+4], 4 ; this -= sizeof(lpVtbl)
  jmp     CSample::QueryInterface

A medida que él describe, tiene una clase que implementa los mismos métodos a través de múltiples interfaces, por lo que tiene múltiples v-tables. (Si usted no sabe COM, todo lo que necesita saber es que funciona con la V-tablas directamente, por lo que un puntero a una interfaz específica debe contener punteros de función a todos los métodos de la interfaz con el fin .)

Si implementa dos interfaces con diferentes métodos en una ranura en particular, necesita varias mesas trapezoidales. Sin embargo, sólo escribir los métodos de superposición de una vez, por lo que el método tiene que ser capaz de trabajar tanto con "este" punteros. Para ello, el compilador genera un método que hace la corrección necesaria y llama a la implementación original.

Por lo tanto, este procesador hace los siguientes pasos:

  1. Fijar los parámetros de entrada, es decir, el puntero "this" escondido, en la primera línea.
  2. Llame a la aplicación real en la segunda línea.
  3. Liberador: No se requiere (véase más adelante)

Aquí es donde la instrucción jmp entra en acción. Normalmente, si se va a llamar a la función utilizando call, volvería a usted, y usted tendría que ret de nuevo a la persona que llama. Puesto que no hay que hacer la limpieza, el compilador hace una optimización donde se mueve la ejecución directamente a la aplicación real y vamos a instrucción de retorno de retorno de la verdadera aplicación de su persona que llama. Esto es sólo una optimización, no es una parte fundamental de thunking. Por ejemplo, 16 / thunks 32 bits convertirá los parámetros de entrada / salida entre 16 y 32 bits según sea necesario, por lo que no pueden saltarse el paso de limpieza; tiene que call, no jmp.

La moraleja de la historia es: si hay que hacer algo, como la optimización jmp, que no se puede escribir directamente en C ++ o su otro lenguaje de alto nivel de elección, seguir adelante y escribir un procesador de lenguaje ensamblador. De lo contrario, acaba de escribir un envoltorio y hacerse con él.

Sinceramente, parece que usted está pidiendo la optimización del rendimiento, y la mayor parte del tiempo (1) el compilador es mejor a la optimización de lo que pensamos y (2) que no va a dar tan grande de una mejora como usted piensa.

Otros consejos

Bueno, has leído procesadores son una solución, y ahora usted está buscando un problema a resolver?

Procesadores, por lo general, son cortos "expedición" que proporcionan funciones de menor importancia - por lo general - codificado. Ajustes

trozos

VTABLE se explican muy bien en Wikipedia en este momento. Ellos usan el patrón común: generar una pequeña función para evitar el cálculo / trabajo adicional en tiempo de ejecución

.

Otros lugares que he visto / procesadores utilizados:

Asociación de un identificador de ventana con un objeto ventana:. Para cada ventana para tener subclases, se genera un pequeño golpe seco sobre la marcha que llama al procedimiento de ventana con la referencia de objeto, el procesador se utiliza entonces como procedimiento de ventana

retardo en la carga DLL: el procesador hace que el DLL se carga la primera vez que una función se llama

.

El atrapar interfaz COM llama: los procesadores proporcionan un punto de inyección para el diagnóstico, y pasar al método actual.

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