significado - ¿Cómo evitar que gcc optimice algunas declaraciones en C?
variables globales y locales c (3)
Desactivar la optimización soluciona el problema, pero no es necesario. Una alternativa más segura es hacer ilegal que el compilador optimice la tienda utilizando el calificador de tipo volatile
.
// Assuming pageptr is unsigned char * already...
unsigned char *pageptr = ...;
((unsigned char volatile *)pageptr)[0] = pageptr[0];
El calificador de tipo volatile
instruye al compilador a ser estricto acerca de los almacenes y cargas de memoria. Uno de los propósitos de volatile
es hacer que el compilador sepa que el acceso a la memoria tiene efectos secundarios y, por lo tanto, se debe preservar. En este caso, la tienda tiene el efecto secundario de causar un error de página y desea que el compilador preserve el error de página.
De esta forma, el código circundante aún puede optimizarse y su código es portátil para otros compiladores que no entienden la sintaxis #pragma
o __attribute__
GCC.
Para hacer una página sucia (conectando el bit sucio en la entrada de la tabla de páginas), toco los primeros bytes de la página de esta manera:
pageptr[0] = pageptr[0];
Pero en la práctica, gcc ignorará la declaración de la eliminación de la tienda muerta. Para evitar que gcc lo optimice, vuelvo a escribir la declaración de la siguiente manera:
volatile int tmp;
tmp = pageptr[0];
pageptr[0] = tmp;
Parece que el truco funciona, pero algo feo. Me gustaría saber si hay directivas o sintaxis que tengan el mismo efecto. Y no quiero usar una bandera -O0
, ya que también traerá una gran penalización al rendimiento.
En lugar de utilizar los nuevos pragmas, también puede usar __attribute__((optimize("O0")))
para sus necesidades. Esto tiene la ventaja de solo aplicar a una sola función y no a todas las funciones definidas en el mismo archivo.
Ejemplo de uso:
void __attribute__((optimize("O0"))) foo(unsigned char data) {
// unmodifiable compiler code
}
Puedes usar
#pragma GCC push_options
#pragma GCC optimize ("O0")
your code
#pragma GCC pop_options
para deshabilitar optimizaciones desde GCC 4.4.
Consulte la documentación de GCC si necesita más detalles.