¿Cómo (en GCC/"GNU C") declara un puntero de función que apunta a una función __attribute__((const))
? La idea es que quiero que el compilador evite generar múltiples llamadas a la función llamada a través del puntero de función cuando puede almacenar en caché el valor de retorno de una llamada anterior.Puntero de función para __tribuir __ ((const)) función?
Respuesta
typedef void (*t_const_function)(void) __attribute__((const));
static __attribute__((const)) void A(void) {
}
static void B(void) {
}
int main(int argc, const char* argv[]) {
t_const_function a = A;
// warning: initialization makes qualified
// function pointer from unqualified:
t_const_function b = B;
return 0;
}
O simplemente:
__attribute__((const)) void(*a)(void) = A;
Bleh, 'typedef' siempre es la solución cuando tienes un tipo de puntero a función desagradable. Aceptado. Pero ¿hay alguna idea de si hay una forma de escribir el reparto en mi comentario sobre la pregunta principal sin un 'typedef'? –
@R. Desafortunadamente, no * sé * cómo enrollarlo todo en una declaración sin un 'typedef' - no parece ser posible en GCC 4.2. '((__attribute __ ((const)) pthread_t (*) (void)) 0xffff0fe0)' es como creo que se haría, pero se interpreta de forma diferente a lo que desea (parece que GCC aplica el atributo al tipo de devolución, no la función). – justin
Aunque esto no es exactamente la respuesta a su pregunta, usted probablemente querrá saber esto:
No es posible en el caso general esperar que el compilador para realizar la optimización se puede esperar aquí. El compilador no puede, en el caso general, realizar el análisis de alias necesario para saber que los usos múltiples de un puntero a función corresponden a la misma función.
Una llamada de función entre dos invocaciones de la función a través del puntero podría, en el caso general, alterar los contenidos del puntero, haciendo que la función invocada sea diferente en la segunda llamada.
Debido a la naturaleza de C, realizar un análisis de alias adecuado a menudo no es posible resolverlo, por lo que no es probable que ocurra este tipo de optimización.
Eso es lo que __attribute __ ((const)) hace - le dice al compilador que usted conoce mejor y le da luz verde para ciertas optimizaciones. –
En mi caso, puede saberlo, porque el puntero es un literal de dirección (un entero convertido a un puntero de función). Ver los comentarios. –
@Vlad: Creo que el punto de Perry era que incluso si la función apuntada es 'const', el compilador también debería asegurarse de que el * puntero * no cambiara entre invocaciones. Pero eso no es demasiado difícil de determinar, y en mi caso no es posible, ya que es una dirección literal absoluta. –
- 1. C++ función de miembro const que devuelve un puntero const .. Pero, ¿qué tipo de const es el puntero devuelto?
- 2. Const Corrección para Getter Función
- 3. C puntero de función de conversión para anular puntero
- 4. Llamar a una función con un puntero no const se restituye a una función de plantilla sobre una función tomando un puntero a const
- 5. Función de conversión con plantilla para el puntero de función
- 6. Almacenamiento de puntero de función en función std ::
- 7. función virtual const vs función virtual no const
- 8. función de pase como puntero de función
- 9. Puntero de función a función de miembro
- 10. C# función de puntero en función sobrecargada
- 11. C++ virtual Const Función
- 12. std :: función -> función de puntero
- 13. Puntero de función C#?
- 14. Pasar la función puntero a miembro como puntero a función
- 15. Puntero de función que apunta a una función que toma un puntero de función
- 16. puntero de función de miembro de fundición
- 17. Asignación de miembro en una función const
- 18. Sintaxis para un puntero a una función que devuelve un puntero de función en C
- 19. Puntero de función de miembro
- 20. puntero de la función Typedef?
- 21. Este puntero de función interna
- 22. Cómo declarar un puntero de función __stdcall
- 23. puntero de función sin typedef
- 24. Puntero de función como argumento
- 25. Operador como puntero de función
- 26. C++ 11 lambdas para el puntero de función
- 27. puntero al miembro de la función
- 28. función como parámetro vs puntero de función como parámetro
- 29. ¿Pasa la función puntero a plantilla como argumento de función?
- 30. puntero de función miembro que devuelve mismo tipo de puntero de función miembro
nunca he hecho eso y casi quedarse dormido con la investigación, pero trate de envolver una llamada por la dirección de una función de este tipo con función declarada explícitamente que tiene el atributo const y acepta que el puntero como un parámetro. Si gcc puede determinar que la dirección del puntero y los argumentos no cambian, debería eliminar las llamadas innecesarias. –
@Vlad: Pensé en eso también, pero luego gcc se rehúsa a alinear la función en los casos en que yo quiera. Originalmente tenía una función de envoltura así, pero la eliminé para corregir el comportamiento de alineación. En caso de que sea interesante, la función en cuestión es '((pthread_t (*) (void)) 0xffff0fe0)' (la función Linux-ARM get-thread-puntero). –
Pregunta interesante. ¿La respuesta de justin tuvo el resultado deseado? – Praxeolitic