variable significado reservada palabra locales lenguaje inicializar globales estaticas declaracion como alcance c gcc

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.