Sie, wie Sie sagen compiler NICHT optimieren Sie bestimmte Codes entfernt?

Gibt es eine Möglichkeit, dem compiler (g++ in meinem Fall) nicht Optimierung bestimmter code entfernt, auch wenn der code nicht erreichbar ist? Ich möchte nur die Symbole in der Objekt-Datei.

Beispiel: Hier ist eine einfache Funktion, und ich will diese Funktion kompiliert werden, auch wenn es nie genannt.

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

Wenn es keine offizielle compiler-Direktive, gibt es einen trick, um den compiler zu denken, dass es eine wichtige Funktion? Oder zumindest denke, dass es nicht ignoriert werden? Ich habe versucht, so etwas wie dieses:

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

aber das hat nicht scheinen, es zu tun.

(Wenn Sie wirklich wissen wollen, warum ich auf der Erde wollen würde, - es hat zu tun mit diese Frage, wo, statt explizite template-Instantiierung mit template class Foo<int> ich möchte einfach in der Lage sein, zu schreiben Foo<int> v, da in vielen Fällen einfacher, da es implizit instanziiert alle Funktionen benötigt, und es funktioniert auch Prima in den debug-Modus ohne Optimierungen ...)

UPDATE:

Hier ist, was ich tun will (als kompilierbare mini-Beispiel):

foo.h (solche Dateien, die mir gegeben werden und nicht veränderbar)

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 (eine Schnittstelle, die ich extrahiert aus 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;
}

Zusammenstellung (keine Optimierung)

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

Zusammenstellung (Optimierung)

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
  • Ich habe versucht, vorkompilierte Header statt, aber die template-Instantiierung Methode macht wesentlich schnellere Zusammenstellung.
  • Kompilieren foo-instantiation.cpp ohne Optimierung ist nicht so ideal, weil dann der code der Bibliothek (foo.h und andere) langsamer.
Konnte Sie nach ein paar kompilierbare code, der zeigt, was Sie bedeuten?

InformationsquelleAutor Frank | 2009-03-20

Schreibe einen Kommentar