2010-10-09 10 views
7

Duplicar posibles:
Constants and compiler optimization in C++¿Const ayuda al optimizador? C++

Vamos a las guerras santas comienzan: he escuchado una serie de diferentes opiniones sobre la utilidad de la const en C++. Por supuesto, tiene usos en las declaraciones de funciones de los miembros, etc. Pero, ¿qué tan útil es como un modificador de variables (o más bien, constantes)? ¿De hecho ayuda al optimizador, si el resto del código se deja igual?

+0

Eso dependería del optimizador, ¿o no? – dmckee

Respuesta

4

const no ayuda al optimizador.

Desde const se puede lanzar lejos con const_cast, es posible escribir programas que utilizan const en varios lugares, y luego desecharla y modificar las variables de todos modos, con el comportamiento definido de acuerdo a la norma. Por lo tanto, el compilador debe ver el código real del programa para determinar qué variables se modifican y, de todos modos, es bastante bueno (por ejemplo, puede determinar que una variable no const sea invariante sobre un determinado bloque de código y optimizar en consecuencia)

Si el compilador trató ciegamente const como garantía de que algo no cambiará, el optimizador podría romper algunos programas bien formados.

const es una característica de tiempo de compilación para ayudar a los programadores a escribir el código correcto, agregando algunas restricciones de tiempo de compilación e indicando un contrato de código (por ejemplo, 'Prometo no cambiar este parámetro'). No tiene nada que ver con la optimización. Si bien las invariantes son importantes para los optimizadores, esto no tiene nada que ver con la palabra clave const.

Existe una excepción: objetos declarados con const. Estos no pueden ser modificados; incluso si son a través del casting, el comportamiento no está definido. Hay un poco de sutileza aquí:

const int ci = 5; 
const_cast<int&>(ci) = 5; // undefined behavior, original object declared const 

int i = 5; 
const int& ci2 = i;  // cannot modify i through ci2, const reference 
const_cast<int&>(ci2) = 5; // OK, original object not declared const 

Así que cuando el compilador ve const int ci probablemente hace suponer que nunca, nunca cambiar, porque la modificación es un comportamiento indefinido. Sin embargo, es probable que este no sea el cuello de botella en su programa, es solo un #define más sofisticado. Aparte de eso, const es débil, solo una palabra clave para el sistema de tipos.

+1

Tenga en cuenta que descartar constness en un objeto que es inherentemente const es un comportamiento indefinido. –

0

No puede doler y, en teoría, podría permitir algunas optimizaciones, así que también podría usarlo, no sé si algún compilador de producción lo hace.

5

En general, no, no ayudará al compilador. Como la const-ness puede descartarse en un segundo en C y C++, sería difícil para el compilador hacer las suposiciones necesarias acerca de los requisitos del código cumplido para las optimizaciones.

Dicho esto, const-correctness siempre se debe utilizar para sus otros beneficios.

+0

Bueno, sí, puede descartarse, pero si lo haces detrás de los compiladores, generará un comportamiento indefinido. Si usa el molde normal, entonces el compilador sabe el punto exacto desde el cual debe soltar la constness. –

17

Hay muchos casos en los que el modificador const no ayudará al optimizador, por el simple hecho de que el compilador ya puede decir si modificó una variable o no. El mayor beneficio de const, en mi opinión, es que le dice al compilador si el programador intentó modificar esa variable, lo cual es útil para encontrar ciertos tipos de errores semánticos en tiempo de compilación en lugar de tiempo de ejecución. Cualquier error que pueda pasar al tiempo de compilación es un gran impulso en la productividad del programador.

+1

Diría que esto es un poco exagerado. Para cosas triviales sí, una vez que vas más allá del límite de llamadas, bueno ... De todos modos, es muy bueno pensar en un modificador const faltante como un error semántico que tiene que ser reparado. –