2009-05-01 9 views
18

he visto algunos métodos como éste:¿Cómo const después de una función optimizar el programa?

void SomeClass::someMethod() const; 

¿Qué hace esta declaración const, y cómo puede ayudar a optimizar un programa?

Editar

veo que la primera parte de esta pregunta se ha hecho antes ... PERO , todavía no responde a la segunda parte: ¿Cómo se vería optimizar el programa?

+2

¿Por qué crees que "optimizaría" el programa? Ese no es su propósito. –

+0

Bueno, siempre escuché acerca de cómo declarar const para una variable ayudaría a la optimización. No veo mucho sentido declarar const de esta manera si no para ayudar a optimizar. – Unknown

+2

Esto ha sido [preguntado antes.] (Http://stackoverflow.com/questions/751681/meaning-of-const-last-in-ac-method-declaration) –

Respuesta

19

Si el compilador sabe que los campos de una La instancia de la clase no se modifica a través de una llamada a la función miembro de la función, no tiene que volver a cargar los campos que pueda haber guardado en los registros antes de la llamada a la función const.

Esto se refiere al tipo de preguntas frecuentes en C++ en el discussion on const_cast.

+0

+1 para abordar la parte de optimización con una explicación que tenga sentido. ¿Hay algún documento que detalla esto? – Unknown

+0

Además, tengo la sensación de que, dado que el acceso de campo es estático, ¿no debería el compilador saber si necesita volver a cargar un campo en un registro o no? – Unknown

+0

Agregué un enlace. ¿A qué te refieres con que "el acceso al campo es estático"? –

1

Impide que someMethod altere cualquier variable miembro de un objeto de esa clase.

+3

... cualquier variable de miembro no mutable. –

+0

...o cualquier método que no haga un molde const/c-style en esto ... :) – RnR

5

Le dice al compilador que el método no tiene efecto en el estado de las clases; no se puede asignar a nada en él. Eche un vistazo al C++ FAQ Lite 18.10.

2

Se le permite llamar a la función miembro de la clase de const objetos:

class SomeClass 
{ 
public: 
    void foo(); 
    void bar() const; 
} 

SomeClass a; 
const SomeClass b; 

a.foo(); // ok 
a.bar(); // ok 
b.foo(); // ERROR -- foo() is not const 
b.bar(); // ok -- bar() is const 

También está el calificador volatile para su uso con volatile objetos, y también se puede realizar funciones const volatile para su uso en const volatile objetos, pero aquellos dos son extremadamente raros.

0

Mi primer pensamiento con respecto a la optimización es que dado que 'const' indica que el estado de la instancia no ha cambiado, el compilador posiblemente tenga más libertad con respecto al reordenamiento de llamadas cercanas a métodos en esa instancia.

+0

El compilador no hará esto. const le impide modificar el objeto, pero la función puede modificar otras cosas, incluido el objetivo de los punteros en el objeto. –

+0

Gracias. Sabía que la función 'const' obviamente podría cambiar el estado interno mutable, pero no estaba seguro si eso necesariamente excluía poder hacer este nivel de optimización ya que desde la perspectiva de los llamantes el objeto no cambia conceptualmente. – imaginaryboy

+0

Nick en realidad significa que los punteros dentro de un objeto no se pueden cambiar, pero lo que apuntan a * can * se puede cambiar incluso dentro de una función de miembro constante. Lo siguiente es posible: class {public: int * x; void blah() const {* x = 42; // pero "x = 0xblahblah;" sería ilegal aquí}}; –

4

El código asm que se genera para el método const será el mismo si el const está allí o no. const es una función del compilador, no del tiempo de ejecución, por lo que si hay mejoras en el rendimiento, creo que el optimizador de compiladores podría usar el const como una pista para cosas como la creación o la determinación de efectos secundarios para una posible optimización. En resumen, el optimizador podría ayudar un poco, pero si el método es sencillo para empezar, dudo que el código generado a partir del optimizador sea const o no const.

He aquí una optimización sencilla que uso (en lugar de fallar y perder elementos como const) que tardan un segundo, pero dan sus frutos. Organice las variables de su clase para que caigan un poco mejor en los límites de la línea de caché y junte las variables más accedidas. Para ello se acaba de poner sus enteros, dobles, flotadores, etc. juntos en la parte superior de sus declaraciones de clase variables y las variables de tamaño especial en la parte inferior de este modo:

int foo; 
int bar; 
double baz; 
SomeObject obj; 
char ch[14]; 
+0

+1 para optimización de direccionamiento, aunque es un poco vago. Tenía los mismos sentimientos de que el código generado sería muy similar. – Unknown

Cuestiones relacionadas