Gibt es eine Möglichkeit, den Compiler (g ++ in meinem Fall) zu nicht bestimmten Code zu optimieren, auch wenn dieser Code nicht erreichbar ist? Ich will nur diese Symbole in der Objektdatei.Wie man Compiler sagt, um bestimmten Code NICHT zu optimieren?
Beispiel: Hier ist eine einfache Funktion, und ich möchte diese Funktion kompiliert werden, auch wenn sie nie aufgerufen wird.
Wenn es keine offizielle Compiler-Direktive gibt, gibt es einen Trick, damit der Compiler denkt, dass es eine wichtige Funktion ist? Oder lassen Sie es zumindest denken, dass es nicht sicher ignoriert werden kann? Ich habe so etwas versucht:
extern bool bar;
void foo(){
if(bar){
Foo<int> v;
}
}
aber das schien es nicht zu tun.
(Wenn Sie wirklich wissen wollen, warum ich auf der Erde das wollen würde - es mit this Frage zu tun hat, wo ich einfach statt explizite Template-Instanziierung mit template class Foo<int>
wollen in der Lage sein Foo<int> v
zu schreiben, da in vielen Fälle, die einfacher ist, da es alle Funktionen benötigt implizit instanziiert, und es funktioniert im Debug-Modus ohne Optimierungen in Ordnung ...)
UPDATE:
Hier ist, was ich (als übersetzbar mini Beispiel tun wollen):
foo.h (solche Dateien sind mir gegeben 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, Ich extrahierte von 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 (keine Optimierung)
g++ -c main.cpp
g++ -c foo-instantiation.cpp
g++ main.o foo-instantiation.oo
Compilation (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 versuchte stattdessen vorkompilierte Header, aber die temp späte Instanziierungsmethode ermöglicht eine viel schnellere Kompilierung.
- Kompilieren
foo-instantiation.cpp
ohne Optimierung ist nicht so ideal, weil dann der Bibliothekscode (foo.h
und andere) langsamer ausgeführt wird.
Könnten Sie einen kompilierbaren Code veröffentlichen, der veranschaulicht, was Sie meinen? –