2010-01-02 10 views
7

Estoy en el proceso de implementar una envoltura independiente de plataforma para bibliotecas cargadas dinámicamente. Por supuesto, cuando cargo funciones desde las bibliotecas, necesito almacenarlas como punteros para uso futuro. Pensé en usar boost :: function para eso en lugar de los punteros de función normal. Claro, eso aumentará el tiempo de compilación, pero eso no es lo que temo. Más bien:boost :: función de rendimiento en tiempo de ejecución

¿Cuál es el costo indirecto introducido por la función boost :: cuando llama a la función almacenada? ¿Hay alguno? ¿Como es de grande?

Supongo que no tendré mucha sobrecarga al llamar a tales funciones de vez en cuando, sin embargo, ¿qué hay de las funciones que se llaman mucho? (ejemplo extremo, glVertex en una biblioteca GL cargada). ¿Cuánto afectaría el rendimiento?

Source-diving boost no respondió mucho:>.

Además, si depende del compilador, estoy interesado principalmente en GCC y MSVC.

+0

La respuesta es: le dolería mucho, no lo use. – user1095108

Respuesta

5

Eche un vistazo a here para una discusión y comparación de varias implementaciones de wrapper de funciones.

+0

¡De hecho, esta es una comparación muy interesante! –

+1

Este artículo es de 2007, ¿sigue siendo relevante? – Adrian

+0

Hmm, podría estar desactualizado a la luz de 0x cosas ahora ... –

5

Como se indica en el Boost documentation, invocar un boost::function incurre en el costo de una llamada a través de un puntero de función en la mayoría de los casos. En otras palabras, si tuviera que usar punteros de función de todos modos, es un lavado, y obtiene un montón de funcionalidad mejorada de forma gratuita.

1

boost :: function lo convirtió en tr1, por lo que es std :: tr1 :: función en compiladores modernos, y simplemente std :: función en realmente compiladores modernos.

En cualquier caso, como ha observado, la función std :: tiene una sobrecarga no nula para la creación (incluida la creación de copias del objeto). En teoría, debería tener la misma sobrecarga que un puntero de función sin procesar para la invocación; es decir, hay un nivel de indirección, pero los compiladores realmente inteligentes pueden alinear ese nivel de indirección.

Por supuesto, hay cosas que puede almacenar en una función std :: que no se puede ajustar o almacenar en un puntero de función.

Cuestiones relacionadas