Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

84
Vistas
Funciones GCC puras/const que aceptan un argumento de puntero

¿Puede alguien aclarar si (y por qué) una función se puede atribuir pure o const si tiene un parámetro de puntero?

De acuerdo con la documentación de GCC :

Algunos de los ejemplos comunes de funciones puras son strlen o memcmp.

El objetivo de una función pura es que solo necesita llamarse una vez para los mismos parámetros, es decir, el resultado puede almacenarse en caché si el compilador lo considera adecuado, sin embargo, ¿cómo funciona esto para memcmp?

por ejemplo:

 char *x = calloc(1, 8); char *y = calloc(1, 8); if (memcmp(x, y, 8) > 0) printf("x > y\n"); x[1] = 'a'; if (memcmp(x, y, 8) > 0) printf("x > y\n");

Los parámetros de la segunda llamada a memcmp son idénticos a los de la primera (los punteros apuntan a la misma dirección), ¿cómo sabe el compilador que no debe usar el resultado de la primera llamada, si memcmp es puro?

En mi caso, quiero pasar una matriz a una función pura y calcular el resultado solo en función de la matriz. Alguien me aseguró que esto está bien, y que cuando los valores en la matriz cambien pero la dirección no, mi función se llamará correctamente.

over 4 years ago · Santiago Trujillo
2 Respuestas
Responde la pregunta

0

Si entendí la documentación correctamente, una función pure puede depender de los valores de la memoria, donde el compilador sabe cada vez que cambia la memoria. Además, una función pure no puede cambiar el estado del programa, como una variable global, solo produce un valor de retorno.

En su código de ejemplo, memcmp puede ser una función pure . El compilador ve que la memoria cambia entre las llamadas a memcmp y no puede reutilizar el resultado de la primera llamada para la segunda llamada.

Por otro lado, memcmp no se puede declarar como una función const , ya que depende de los datos en la memoria. Si fuera const , el compilador podría aplicar optimizaciones más agresivas.

Por esta razón, parece seguro declarar la función que desea implementar como pure (pero no const ).

over 4 years ago · Santiago Trujillo Denunciar

0

Con respecto a puro, podemos ver en el artículo Implicaciones de funciones puras y constantes que puro significa que la función no tiene efectos secundarios y solo depende de los parámetros.

Entonces, si el compilador puede determinar que los argumentos son los mismos y que la memoria no ha cambiado entre llamadas posteriores, puede eliminar las llamadas posteriores a la función pura, ya que sabe que la función pura no tiene efectos secundarios.

Lo que significa que el compilador tiene que hacer un análisis para poder determinar si los argumentos de la función pura podrían haberse modificado antes de que pueda decidir eliminar las llamadas posteriores a una función pura para los mismos argumentos.

Un ejemplo del artículo es el siguiente:

 int someimpurefunction(int a); int somepurefunction(int a) __attribute__((pure)); int testfunction(int a, int b, int c, int d) { int res1 = someimpurefunction(a) ? someimpurefunction(a) : b; int res2 = somepurefunction(a) ? somepurefunction(a) : c; int res3 = a+b ? a+b : d; return res1+res2+res3; }

y muestra el ensamblaje optimizado generado que muestra que somepurefunction solo se llamó una vez y luego dice:

Como puede ver, la función pura se llama una sola vez, porque las dos referencias dentro del operador ternario son equivalentes, mientras que la otra se llama dos veces. Esto se debe a que el compilador no conoció ningún cambio en la memoria global entre las dos llamadas de la función pura (la función en sí no pudo cambiarlo ; tenga en cuenta que el compilador nunca tendrá en cuenta los subprocesos múltiples, incluso cuando lo solicite). explícitamente a través del indicador -pthread), mientras que la función no pura puede cambiar la memoria global o usar operaciones de E/S.

Esta lógica también se aplica a un puntero, por lo que si el compilador puede probar que la memoria apuntada al puntero no se ha modificado, entonces puede eliminar la llamada a la función pura, de modo que en su caso, cuando el compilador vea:

 x[1] = 'a';

no puede eliminar la segunda llamada a memcmp porque la memoria apuntada por x ha cambiado.

over 4 years ago · Santiago Trujillo Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda