2010-10-05 10 views
6

Entiendo el comportamiento de const-tipos de datos calificados. Tengo curiosidad, sin embargo, si hay alguna ganancia o pérdida de rendimiento por exceso o falta de celo de las variables calificativas como const. Estoy pensando particularmente en las variables declaradas y usadas exclusivamente dentro de un bloque de código aislado. Por ejemplo, algo como:¿Declarar las variables de C++ ayuda o perjudica el rendimiento?

const qreal padding = CalculatePadding(); 
const QSizeF page_size = CalculatePagePreviewSize(padding); 
const QRectF content_rect = CalculatePagePreviewContentRect(page_size); 
const QList<QRectF> pages = renderer.BuildPrintPages(printer_, map_scene_); 
const QFont page_number_font = CalculatePageNumberFont(); 
const QFontMetrics metrics(page_number_font); 

Supongamos que sólo necesito const métodos Calificado sobre todos estos temas ¿Hay alguna ganancia de rendimiento en declarar a todos const (y más.)? O, por el contrario, ¿esto en realidad perjudica el rendimiento?

tengo curiosidad por tanto el rendimiento en tiempo de ejecución (estoy conjeturando que esto no hace ninguna diferencia en cuanto al const es exclusivamente una comprobación en tiempo de compilación - alguien puede confirmar?) Y el tiempo de compilación rendimiento. No tengo suficiente experiencia con C++ para tener una idea de esto, y me pregunto si debería equivocarme por exceso o por defecto de aplicación de const cuando todas las demás cosas (mantenibilidad, etc.) son iguales.

+1

en la mayoría de los casos, no hay diferencia de rendimiento en tiempo de ejecución – Anycorn

+2

dupe? http://stackoverflow.com/questions/3435026/can-const-correctness-improve-performance – Anycorn

+0

Qt es mucho copy-on-write así que sospecho que const puede tener un efecto real aquí. –

Respuesta

20

const es principalmente una cosa de tiempo de compilación, sin embargo, declarar algo como const a veces permite ciertas optimizaciones. Si el código en cuestión no es un cuello de botella de rendimiento, no me preocuparía y simplemente use const según lo previsto: para producir un código más claro y evitar hacer cosas estúpidas.

2

Mi comprensión es que const puede ser utilizado por el compilador para optimizar el rendimiento, pero no es garantía de eso; no debería haber una desventaja en el rendimiento, sin embargo. Posiblemente podría afectar el comportamiento del tiempo de ejecución (es decir: el compilador podría poner variables const en páginas de memoria de solo lectura).

No debería tener un impacto significativo en el rendimiento, pero habría error al usarlo más para facilitar el mantenimiento del código. Solo mi opinión, sin embargo.

1

Si bien la respuesta es técnicamente "sí", la respuesta práctica es NO. Es cierto que el compilador puede, bajo ciertas circunstancias, realizar optimizaciones de código teniendo en cuenta que un valor determinado no puede cambiar o que un método no modificará el objeto propietario. Sin embargo, estos serán casos situacionales y tan increíblemente lentos en las malas hierbas de la optimización que sería casi seguro un error tenerlo en cuenta por adelantado.

0

const está ahí para ayudarlo a detectar errores en tiempo de compilación. Sin embargo, ya que existe esta cosa llamada const_cast, siempre se puede cambiar la constness de cualquier variable para que el compilador realmente no pueda salirse con la suya optimizando nada. (También puede divertirse con moldes de estilo c para deshacerse de la constness que podría hacer que las optimizaciones no sean válidas.)

+1

evite 'const_cast' en todo momento, y úselo solo cuando no tenga otra opción (por ejemplo: está trabajando con una lib externa que no puede cambiar la interfaz, pero sabe que modificar un objeto const es" lo suficientemente seguro ") . – rubenvb

+2

Esto no es realmente cierto. Si definió una variable como const, no puede descartarla * y * escribir en ella. Un compilador que almacena en caché un valor variable basado en el hecho de que la variable es const está bien. Cualquier programa que escribe en una variable const tiene un comportamiento indefinido. –

+0

Johannes - primer resultado de una búsqueda en google en const y optimización: http://www.gotw.ca/gotw/081.htm - pruébelo usted mismo, puede escribir en una variable incontrolada – miked

2

En mi (limitada) experiencia, const PUEDO dañar el rendimiento por bastante (¡sorpresa!) A saber, cuando trabaje con clases de contenedores, tenga cuidado con lo que hace la continuidad: para las matrices, podría simplemente forzar al compilador a crear una copia de su contenedor (por ejemplo, una matriz) una vez que se accede a un solo elemento para leer solo ... Esto fue una gran dolor para localizar en el código en el que estoy trabajando.

Cuestiones relacionadas