2010-05-01 24 views
6

Me preguntaba si hay ventajas de usar una función de miembro estático cuando hay un equivalente no estático. ¿Tendrá como resultado una ejecución más rápida (debido a que no debe preocuparse por todas las variables miembro), o quizás un menor uso de la memoria (debido a que no se incluye en todas las instancias)?¿Ventajas de utilizar una función miembro estática en lugar de una función miembro no estático equivalente?

Básicamente, la función que estoy viendo es una función de utilidad para rotar una matriz entera que representa colores de píxeles un número arbitrario de grados alrededor de un punto central arbitrario. Se coloca en mi clase base Bullet abstracta, ya que solo las viñetas la usarán y no quería que se lo llamara en alguna clase de utilidad. Es un poco largo y se usa en todas las clases de viñetas derivadas, por lo que probablemente no sea una buena idea alinear. ¿Cómo sugeriría que defina esta función? Como una función miembro estática de Bullet, de una función de miembro no estático de Bullet, o tal vez no como miembro de Bullet pero definido fuera de la clase en Bullet.h? ¿Cuales son las ventajas y desventajas de cada uno?

Respuesta

9

No existe absolutamente ninguna diferencia de rendimiento entre las funciones de miembro estático y las funciones gratuitas.

Desde el punto de vista del diseño, parece que la función en cuestión tiene muy poco que ver con Viñetas, por lo que preferiría colocarla en una biblioteca de utilidades en algún lugar, no hay sobrecarga de tiempo de ejecución al hacerlo usted no tiene una biblioteca así.

En cuanto a la pregunta original, si la función no pertenece obviamente a una clase particular, entonces debería ser una función libre. A lo sumo, debe pertenecer a un espacio de nombres, para controlar su alcance. E incluso si pertenece a una clase, la mayoría de las veces, todavía preferiría la función gratuita a menos que la función requiera acceso a miembros privados.

+0

Sí, no estoy muy seguro de cómo funciona C++. Vengo de un fondo Flash y ActionScript tiene gastos generales horribles en los lugares más extraños: las funciones estáticas en las clases de utilidad se resuelven en tiempo de ejecución, así que como Math.sin cada vez que se usa el jugador tiene que buscar la clase Math a través de la tabla hash y luego buscar el función de pecadoMe alegra oír que C++ al menos tiene más sentido común ... – jonathanasdf

+3

@Zan: las funciones miembro estáticas no tienen un puntero 'this'. –

+0

De hecho, tienes razón. Leí la línea a la que respondía, ya que "No hay absolutamente ninguna diferencia de rendimiento entre las funciones de miembro y las funciones gratuitas". que no es realmente lo que dice. Mi error. –

1

Si el método necesita estar en el espacio de nombres de la clase, pero no opera en una instancia de esa clase (es decir, no usa this ni usa ningún método no estático), debe declararse static.

En la parte superior de mi cabeza, utilicé métodos estáticos varias veces cuando tenía una clase que realizaba un seguimiento de sus instancias. Utilizó una lista doblemente enlazada, el constructor insertado, y el destructor eliminó el objeto de la lista. El objeto en sí tenía los punteros anterior y siguiente como miembros, y el primero y el último punteros eran miembros estáticos, y todos estos punteros eran privados. Todos los métodos que funcionaron en la lista, p. búsqueda o recuento, eran métodos estáticos.

3

Normalmente se usa static si es posible, para eliminar la necesidad de un objeto y eliminar el argumento this extraño.

Pero una excepción son los functors: clases que definen operator() para que los objetos se puedan "llamar" como funciones. Idiomáticamente, se ha declarado operator() dentro del bloque class {}, lo que lo convierte en inline.

Luego, si la función es pequeña, se inserta en la función de llamada y el puntero this está optimizado.

Si la función es grande, es posible que no esté en línea. Pero la desventaja minúscula de tener un argumento extra probablemente sea empequeñecida de todos modos.

Cuestiones relacionadas