2010-03-16 11 views
6

Estoy usando gcc con la optimización de -finline-functions para compilaciones de versiones. Para combatir la saturación del código porque trabajo en un sistema integrado, quiero decir que no en línea funciones particulares. La forma obvia de hacer esto sería a través de atributos de función, es decir, , atributo (noinline). El problema es que esto no parece funcionar cuando enciendo la optimización de las funciones globales -finline que es parte del conmutador -O3.gcc -finline-functions behavior?

También tiene algo que ver con el hecho de que se trata de una plantilla, ya que no se incluye una versión no plantilla de la misma función, que es la esperada.

¿Alguien tiene idea de cómo controlar la alineación cuando este interruptor global está activado?

Aquí está el código:

#include <cstdlib> 
#include <iostream> 

using namespace std; 

class Base 
{ 
public: 

    template<typename _Type_> 
    static _Type_ fooT(_Type_ x, _Type_ y) __attribute__ ((noinline)); 
}; 

template<typename _Type_> 
_Type_ Base::fooT(_Type_ x, _Type_ y) 
{ 
    asm(""); 
    return x + y; 
} 


int main(int argc, char *argv[]) 
{ 
    int test = Base::fooT(1, 2); 
    printf("test = %d\n", test); 

    system("PAUSE"); 
    return EXIT_SUCCESS; 
} 
+1

No está relacionado, pero los identificadores que comienzan con un guión bajo seguido de una letra mayúscula están reservados para el compilador. – GManNickG

+0

¿No debería adjuntarse __atribución __ ((noinline)) a la definición? – jpalecek

+0

@jpalecek: No es un error de compilación – user176168

Respuesta

4

El docs for GCC's noinline dicen:

Este atributo función impide una función de la consideración de procesos en línea. Si la función no tiene efectos secundarios, existen optimizaciones distintas de la línea interna que hacen que las llamadas a funciones se optimicen, aunque la llamada a la función es en vivo. Para mantener este tipo de llamadas de ser optimizado de distancia, puesto

 asm (""); 

(ver extendido ASM) en la función llamada, para servir como un efecto secundario especial

creo que lo que podría estar sucediendo a usted es que dado que la función Base::fooT<> no tiene efectos secundarios, GCC invoca las otras optimizaciones no especificadas mencionadas anteriormente.

+0

¡Perdón por la larga demora en responder! No por desgracia, gcc todavía lo insinúa, lo había intentado antes. Estoy usando 4.1.1 ¿Alguien sabe de un error relacionado con esto? Gracias por la respuesta, aunque no parece que haya mucho conocimiento sobre este tema ... – user176168

1

Trate de poner el atributo noinline después de la static y antes de la definición de este modo:

template<typename _Type_> 
    static __attribute__ ((noinline)) _Type_ fooT(_Type_ x, _Type_ y); 

Esto funcionó para mí y parece funcionar para otros también, ver: How can I tell gcc not to inline a function?

Por alguna razón que doesn No funciona poniendo el atributo noinline después de la función o poniendo el asm("") en el cuerpo de la función a pesar de lo que dice la documentación gcc.

1

Poco hilo viejo pero vale la pena responder. Si nada de lo anterior funciona para usted siempre hay una solución simple. Debe ocultar la implementación de la unidad de traducción en la que desea utilizar dicho método colocándolo en otro archivo cpp.

EDITAR

En GCC> = 4.5 no es un atributo noclone que sustituyen noinline en medio de la función especializada.