Forum: Compiler & IDEs Define für Optimierungsstufe?


von Nybass (Gast)


Lesenswert?

Hallo zusammen,
gibt es eine Möglichkeit die eingestellte Optimierungsstufe auszugeben?
Gruß Timo

von Sven P. (Gast)


Lesenswert?

Der GCC stellt dir
1
#define __OPTIMIZE__ 1
2
#define __OPTIMIZE_SIZE 1
zur Verfügung, wenn optimiert oder auf Größe optimiert wird.

Davon sollte dein Programm aber i.d.R. nicht abhängig sein.

von Nybass (Gast)


Lesenswert?

Bei mir werden die Definitionen leider nicht gefunden.
Ich schreibe nur eine Testroutine und möchte auf meinem Terminal dann 
sehen ob die Optimierung an oder aus ist...
Gruß

von Klaus W. (mfgkw)


Lesenswert?

Die sind aber schon lange im gcc.
1
klaus@a64a:~ > gcc -Wall tst.c && ./a.out
2
keine Optimierung
3
klaus@a64a:~ > gcc -Wall -Os tst.c && ./a.out
4
Optimierung nach Groesse
5
klaus@a64a:~ > gcc -Wall -O1 tst.c && ./a.out
6
Optimierung nach Geschwindigkeit
7
klaus@a64a:~ > gcc -Wall -O2 tst.c && ./a.out
8
Optimierung nach Geschwindigkeit
9
klaus@a64a:~ > gcc -Wall -O3 tst.c && ./a.out
10
Optimierung nach Geschwindigkeit
11
klaus@a64a:~ > cat tst.c
12
#include <stdlib.h>
13
#include <stddef.h>
14
#include <stdio.h>
15
#include <string.h>
16
17
int main( int nargs, char **args )
18
{
19
20
#ifdef __OPTIMIZE_SIZE__
21
  printf( "Optimierung nach Groesse\n" );
22
#elif defined __OPTIMIZE__
23
  printf( "Optimierung nach Geschwindigkeit\n" );
24
#else
25
  printf( "keine Optimierung\n" );
26
#endif
27
28
  return 0;
29
}

von Nybass (Gast)


Lesenswert?

Ja genau so hab ich es eigentlich gemacht...
Liegt vielleicht an der IDE (CrossWorks), der aber GCC v4.1.1 verwendet

Gruß

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Lass dir doch mal alle Makros ausgeben: avr-gcc -E -dM <filename>

von Klaus W. (mfgkw)


Lesenswert?

bzw. gcc -O1 -E -dM <filename> etc.

von Nybass (Gast)


Lesenswert?

Ja funktioniert nun...
für die einzelnen stufen gibt es kein define oder?!

von Klaus W. (mfgkw)


Lesenswert?

keine ahnung, ich habe noch nie davon gehört.

Der Wert von _OPTIMIZE_ ist auch immer 1, egal ob man mit
-O1, -O2 oder -O3 aufruft.

Letztlich würde das auch nicht viel helfen, weil -O...
ohnehin nur eine Zusammenfassung vieler kleiner Einstllungen ist,
die man eigentlich auch abfragen können müsste, wenn man es ernst
meint.

von Sven P. (Gast)


Lesenswert?

Vorallem, und da wiederhole ich mich gerne, sollte dein Programm 
unabhängig von der Optimierung funktionieren.

von Rolf Magnus (Gast)


Lesenswert?

Es gibt aber eben manchmal Dinge, die nicht davon unabhängig sind, wie 
z.B. bei der avr-libc die delay-Funktionen, die nur mit eingeschalteter 
Optimierung korrekt funktionieren.

von Sven P. (Gast)


Lesenswert?

Rolf Magnus schrieb:
> Es gibt aber eben manchmal Dinge, die nicht davon unabhängig sind, wie
> z.B. bei der avr-libc die delay-Funktionen, die nur mit eingeschalteter
> Optimierung korrekt funktionieren.

Das hat aber nicht dich als Anwender zu interessieren, sondern die 
Bibliotheks- und Compilerbauer. Auch der inb()/outb()-Krams im 
Linux-Kernel funktioniert i.d.R. nur mit Optimierung. Und selbst die 
verlassen sich nur auf die Optimierung, weil sie wissen, was passiert. 
Bei einem anderen Compiler geht das schon in die Hose.

Du als Anwender weißt ja noch nichtmal, welche Optimierungen 
durchgeführt werden. Allenfalls kannst du einen Algorithmus zweimal 
implementieren, einmal mit Tabellen bei OPTIMIZE und einmal als nackten 
Algorithmus bei OPTIMIZE_SIZE.

von Rolf Magnus (Gast)


Lesenswert?

Sven P. schrieb:
> Rolf Magnus schrieb:
>> Es gibt aber eben manchmal Dinge, die nicht davon unabhängig sind, wie
>> z.B. bei der avr-libc die delay-Funktionen, die nur mit eingeschalteter
>> Optimierung korrekt funktionieren.
>
> Das hat aber nicht dich als Anwender zu interessieren, sondern die
> Bibliotheks- und Compilerbauer.

Es hat den zu interessieren, der etwas programmiert, das von der 
Optimierung abhängt. Wenn das eine Library-Funktion ist, dann eben der 
Programmierer der Library.

> Auch der inb()/outb()-Krams im Linux-Kernel funktioniert i.d.R. nur mit
> Optimierung. Und selbst die verlassen sich nur auf die Optimierung,
> weil sie wissen, was passiert. Bei einem anderen Compiler geht das
> schon in die Hose.

Bei Mikrocontroller-Programmierung kommt es schon mal vor, daß man sich 
die Hände schmutzig machen muß.

von Sven P. (Gast)


Lesenswert?

Rolf Magnus schrieb:
> Es hat den zu interessieren, der etwas programmiert, das von der
> Optimierung abhängt. Wenn das eine Library-Funktion ist, dann eben der
> Programmierer der Library.
Ja, ich versteh schon, was du meinst.
Die Frage ist halt: Wer, außer den Compiler- und 
(Standard-)Bibliotheksbauern, kann denn überhaupt etwas schreiben, was 
von einer Optimierung abhängt, von der überhaupt nicht weiß, was und wie 
und warum passiert?
Ein normales Programm sollte in jedem Fall unabhängig von der 
Optimierung funktionieren. Eben, weil man ohne Kenntnisse der 
Compiler-Interna überhaupt nicht weiß, was denn überhaupt optimiert 
wird, und von was man überhaupt abhängig ist.

von Klaus W. (mfgkw)


Lesenswert?

Du hast immerhin selbst eine sinnvolles Beispiel geliefert:
Auswahl eines Algos, je nach -O....

Allerdings fällt es schwer, viel mehr sinnvolle Anwendungen zu
konstruieren.

von Sven P. (Gast)


Lesenswert?

Naja, ich bezog mich auf den Wunsch, auch noch die Optimierungsstufe 
herauszufinden.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.