2010-09-26 12 views
10

En C++ 98/C++ 03, no hay pure/const function keywords en el idioma.funciones pure/const en C++ 0x

  1. ¿Ha cambiado esto en C++ 0x?

  2. En caso afirmativo, ¿es posible establecer dicho indicador incluso en objetos de función (std::function)? ¿De modo que puedo pasar algunas funciones del puntero de función o lambda y además dar la información de que es una función pura/const? La función llamada puede tener una ruta de ejecución optimizada para dicha función.

  3. ¿Hay alguna forma de comprobar si una función dada es pura/const? Es decir. por ejemplo, si hay tal indicador en std::function como se describió anteriormente, probablemente podría verificar ese indicador. Pero tal vez haya incluso una forma más general.

Si no ha cambiado, ¿por qué no? Creo que podría ser muy útil contar con ese apoyo.

¿Hay alguna propuesta abierta al respecto?

+0

Estoy tratando de limpiar la etiqueta [tag: pure] - [ver meta] (http://meta.stackexchange.com/questions/171779/what-is-the-pure-tag- para) para más información. No sé mucho sobre [tag: C++], así que ¿puedo pedirle consejo sobre otras etiquetas para usar en esta pregunta y preguntas como esta, sobre 'pure/const'? –

Respuesta

8
  1. ¿Ha cambiado esto en C++ 0x?

No. Hay una constexpr pero significa compilar constante de tiempo. Si sus parámetros son constexprs también, entonces se ejecuta en tiempo de compilación, pero de lo contrario es una función normal. Como deben definirse en la misma unidad de traducción y consistir en una única declaración de devolución, probablemente estarán en línea y se realizará la optimización anterior. No se puede usar para proporcionar la información del compilador sobre la función vinculada externamente.

Si no ha cambiado, ¿por qué no? Creo que podría ser muy útil contar con ese apoyo.

En realidad, no creo que lo necesite. El lenguaje ya es demasiado grande y el programador puede reescribir fácilmente este código para que sea más eficiente en función de su conocimiento de todos modos. A diferencia de restrict, no proporciona ninguna información que no se pueda expresar por otros medios.

¿Hay alguna propuesta abierta al respecto?

No he visto ningún documento del comité sobre ese tema.

+0

Gracias por la información. Pero pure/const realmente proporcionaría más información que en algunos casos puede ser muy complicada/casi imposible de expresar de otra manera. El compilador incluso podría agregar memoria de forma transparente. – Albert

+1

@Albert: es poco probable que ocurra la memorización automática en C++. Sin embargo, podrías agregarlo a tus propias funciones. Por ejemplo, construyendo en 'std :: function ', probablemente sea posible crear 'my_memoized_function '. – Potatoswatter

+1

@Albert: pero podría implementar la memorización usted mismo, por lo que una vez más, no es nada que no pueda expresarse de otra manera. – jalf

6

gcc usa __attribute__((<attr>)) para definir extra attributes en las funciones.

  • pura: sólo accede (pero no modifica los parámetros) y la memoria global. GCC usa esta información para determinar si el optimizador puede omitir por completo las llamadas repetidas a la función (memoria local). Dos funciones puras notables son strlen y memcmp.

  • const: no se debe confundir con C++ const, las funciones const solo tienen acceso a los parámetros y esos parámetros no deben ser punteros.Básicamente es una versión más restringida de pure. El optimizador trata las funciones const de la misma manera que pure. Aunque en teoría podría realizar una memoria más agresiva (no local) que para pure.

La nueva sintaxis de atributos de C++ 11 (§7.6) se diseñó para hacer exactamente este tipo de cosas. Actualmente no se puede usar la sintaxis de atributos de C++ para establecer los atributos de GCC, pero eso cambiará en futuras versiones de gcc.

Por lo tanto, podrá asignar el atributo pure a funciones que utilizan la sintaxis del atributo. Pero no hay un atributo pure estándar. pure será específico del compilador, pero hará lo correcto en gcc.

Para los curiosos, aquí está la lista de los atributos estándar:

  • align
  • NoReturn
  • anulación
  • ocultar
  • base_check
  • carries_depend ency
+0

¿Todavía existe un atributo de "anulación", incluso ahora que C++ 11 tiene una palabra clave 'anular' explícita? – snogglethorpe

+0

'override',' base_check', y 'oculting' se incluyeron en la palabra clave 'override'. –