2010-01-15 17 views
5

Soy un fanático de const, y me esfuerzo por hacer que todo sea lo más const posible.Utilidad de const (C++)

He intentado ver varias salidas de desmontaje de las funciones de const y non const de las funciones, y todavía tengo que ver una mejora notable. Supongo que los compiladores de hoy en día pueden hacer cosas inteligentes con funciones no const que técnicamente podrían ser const.

¿Todavía hay casos en que const es útil a nivel de máquina? ¿Algún ejemplo?

+1

Siempre tenga cuidado con el poder del puntero y el lanzamiento. ;) – kenny

+0

la optimización de const se realiza principalmente en variables const - debe estas optimizaciones por todas partes en el montaje - mi experiencia si desde vC++ sin embargo. –

+1

Una vez me dejó perplejo un caso en el que const activó una optimización: http://stackoverflow.com/questions/1121791/optimisation-of-division-in-gcc. Resultó ser solo mi versión "severamente vieja" de gcc: en las versiones más nuevas, la const no era diferente del rendimiento, que es lo que esperaba. Tenga en cuenta que mi expectativa era que const * debería * no hacer ninguna diferencia en el rendimiento, me decepcionó cuando lo hizo. Debido al aliasing, 'const' casi nunca permite al compilador asumir que algo no cambiará, excepto en situaciones donde un compilador inteligente puede ver que no cambia incluso sin const. –

Respuesta

9

Hasta donde yo sé, el único efecto de marcar una función const es permitir que la función sea llamada en un objeto const. No hay beneficio de optimización.

Herb Sutter tiene un artículo que discute const y optimización en profundidad:

La única área que const es útil en el nivel de la máquina está cuando se aplica a los datos - datos const podría poder colocarse en la memoria no grabable.

+0

¿Lo sabes? de cualquier plataforma/implementación que realmente tenga esta proverbial memoria no grabable? E incluso si uno lo hace, ¿cómo es eso una optimización del rendimiento? ¿Por qué sería más rápido acceder? –

+2

He encontrado que 'const estático' para una variable es más rápido que' const'. La versión 'const' copió los datos de la ROM para apilar, mientras que la versión' static const' accedió a los datos directamente desde la ROM. Esto fue probado en la lista de asamblea. –

+0

(+1) todavía no debería haber utilizado el ejemplo de memoria no grabable: D –

18

El uso principal de const no es generar un mejor código, sino protegerlo de usted mismo, asegurando que no cambie accidentalmente algo que no pretendía.

+0

+1: Definitivamente de acuerdo. Pero la gente lo promociona como una posible optimización del compilador. Tengo curiosidad si eso sigue siendo cierto, y cuáles son los casos. –

+0

(-1) en un lenguaje que es un campo de minas para un programador nuevo y antiguo - const no agrega seguridad - simplemente hace que todo sea más complicado. Ahora desde un punto de vista de optimización del compilador ..... –

+7

¿Qué? 'const' no agrega seguridad? Veamos, puedes romper algo que puedes cambiar, pero no puedes romper algo que no puedes cambiar ... – GManNickG

2

El propósito de const es principalmente arquitectónico. Cuando declaras algo como const, deberías estar pensando en lo que representa: algo que no puede cambiar.

+0

O, más correctamente, algo que * should * not change. – greyfade

+0

No necesariamente "más correcto". Si está escribiendo un sistema de física, la velocidad de la luz * no puede * cambiar, mientras que, por ejemplo, la presión dentro de una bola * no debe * cambiar. Son conceptos muy diferentes. –

+0

Pero esto no es física, es C++. Y como señalan otras respuestas, las funciones miembro de const no garantizan que no se pueda cambiar nada. –

2

Esto no es exactamente una respuesta directa a la versión detallada de su pregunta, pero coincide con la pregunta del título.

Me gusta usar const bastante agresivamente también, en parte porque creo que hay un cambio de un minuto que mejorará el rendimiento, pero sobre todo porque reduce los errores y comunica el intento mejor.

  1. Tener métodos const permite a los usuarios la libertad de tener útiles objetos const.
  2. Tener objetos const permite a los escritores de bibliotecas comunicarse sucintamente a los usuarios si una función o método puede cambiar los parámetros de entrada.
  3. Tener objetos const le permite hacer que el compilador le grite si accidentalmente hace algo que se modificará y el objeto que no desea modificar.
1

Sigo su estrategia, y veo que es una utilidad principal para un ser humano. He adoptado un estilo muy funcional en gran parte de mi programación, y const ayuda a hacer cumplir eso e ilustrarlo a otros programadores que podrían estar leyendo mi código.

En verdad, veo algunos de los nuevos atributos de función que C++ 0x va a admitir como algo un poco más útil para los compiladores. Sabiendo que el resultado de una función depende únicamente de sus argumentos, y no sigue ningún puntero pasado a él, significa que las llamadas a la función pueden estar sujetas a CSE.

12

Es bastante raro que const ayude realmente al compilador a optimizar.Debe tener en cuenta que el const_cast se puede usar en cualquier lugar para eliminar la constness de un objeto (aunque modificar el objeto resultante no siempre está bien definido, en algunos casos es así, por lo que el compilador debe tener cuidado al asumir que solo porque un objeto const se pasa a una función, no se modificará)

Del mismo modo, la palabra clave mutable arruina las cosas. Puede pasar un objeto const a una función, pero ¿y si ese objeto contiene un campo mutable?

El compilador tiene que trabajar mucho para verificar que es seguro suponer que un objeto es realmente constante, y para el momento en que se hace toda esta verificación, la palabra clave const en realidad no importa, porque podría han hecho todos los mismos análisis en un objeto no const regular para determinar que no se está modificando y se pueden tratar como constantes.

No diré que no hay unos pocos casos de borde donde la palabra clave const puede habilitar nuevas optimizaciones, pero en general, const no es una consideración de rendimiento, sino de corrección. Úselo para detectar más errores en tiempo de compilación, no para acelerar su código.

+2

+1 porque "cuando se hace toda esta verificación, la palabra clave const realmente no importa ...": esa es la clave. Además, buen resumen en general. –

+2

Lo que le digo a la gente es que 'const' significa" acceso de solo lectura, por favor "más de lo que significa" constante ", debido a cosas como' mutable', y porque los objetos 'const' no siempre se ubican en solo lectura memoria. –