Comment dire le compilateur de ne PAS optimiser certains le code?

Est-il un moyen de dire au compilateur g++ dans mon cas) à pas optimiser certaines de code à distance, même si ce code n'est pas accessible? Je veux juste ces symboles dans le fichier d'objet.

Exemple: Ici est une simple fonction, et je ne veux que cette fonction soit compilé, même s'il n'est jamais appelé.

void foo(){
  Foo<int> v;
}

Si il n'existe pas de directive du compilateur, est-il un truc pour faire le compilateur pense que c'est une fonction importante? Ou au moins lui faire croire qu'il ne peut pas être ignoré en toute sécurité? J'ai essayé quelque chose comme ceci:

extern bool bar;
void foo(){
  if(bar){
    Foo<int> v;
  }
}

mais cela ne semblait pas le faire.

(Si vous voulez vraiment savoir pourquoi j'sur la terre ne souhaitez que -- qu'il a à faire avec cette question, où, au contraire explicite de l'instanciation d'un modèle avec template class Foo<int> je veux simplement être en mesure d'écrire Foo<int> v, puisque dans de nombreux cas, c'est plus facile car elle implicitement instancie toutes les fonctions nécessaires, et il fonctionne bien dans le mode de débogage sans optimisations ...)

Mise à JOUR:

Voici ce que je veux faire (comme un compilable mini exemple):

foo.h (ces fichiers sont donné à moi et non modifiables)

template<class T>
struct Foo {
  T val_;
  Foo(T val) : val_(val) {
      //heavy code, long compile times
  }
};

foo-instantiation.cpp

#include "foo.h"
void neverCalled() {
  Foo<int> f(1);
}

//The standard way to instantiate it is this:
//template class Foo<int>;
//but in reality it is often hard to find out 
//exactly what types I have to declare.
//Usage like Foo<int> f(1); will instantiate all
//dependent types if necessary.

foo-decl.h (une interface que j'ai extrait de foo.h)

template<class T>
struct Foo {
  T val_;
  Foo(T val); //no heavy code, can include anywhere and compile fast
};

main.cpp

#include <iostream>
#include "foo-decl.h"

int main(int argc, char** argv){
  Foo<int> foo(1);
  return 0;
}

Compilation (pas d'optimisation)

g++ -c main.cpp
g++ -c foo-instantiation.cpp
g++ main.o foo-instantiation.oo

Compilation (optimisation)

g++ -O2 -c main.cpp
g++ -O2 -c foo-instantiation.cpp
g++ main.o foo-instantiation.oo
main.o(.text+0x13): In function `main':
: undefined reference to `Foo<int>::Foo(int)'
collect2: ld returned 1 exit status
  • J'ai essayé d'en-têtes précompilés à la place, mais l'instanciation du modèle de méthode permet d'accélérer la compilation.
  • Compilation foo-instantiation.cpp sans optimisation n'est pas idéale, car alors le code de la bibliothèque (foo.h et autres) vont s'exécuter plus lentement.
Pourriez-vous poster quelques compilable de code qui illustre ce que tu veux dire?

OriginalL'auteur Frank | 2009-03-20