25. november 2003 - 22:28
Der er
16 kommentarer og 3 løsninger
hvor optimerende er kompilere?
Jeg har brug for at kunne skrive til en log fil for at kunne validere program kørslen. Dette skal kun gøres i LOG/DEBUG mode. Pt benytter jeg en metode som overordnet set ser således ud: static const bool LOG = true; void doLog(string s) { if(LOG) { .. skriv log data } } Mit spørgsmål er, når LOG er false kan kompileren (g++) så "se" at doLog ikke behøver blive kaldt ? Hvis ikke hvordan laver man så sådan en log/debug smart smart så man ikke får en overflødeig if() udført ? #ifdef LOG dolog("hello"); #endif eller hvad ?
Annonceindlæg fra DE-CIX
25. november 2003 - 22:31
#1
Det første bør compileren se. Du skal dog nok oversætte med -O
25. november 2003 - 22:32
#2
ja med ifdef slipper du helt for at det overhovedet kommer med i din exe-fil, det er endnu mere optimalt da den fylder mindre og bruger mindre memory
25. november 2003 - 22:32
#3
Nej - hov - ikke så funktionen ikke bliver kaldt. Du kan lave en makro med en if - den vil bliver fjernet af optimeringen
25. november 2003 - 22:45
#4
En smart compiler (og det inkluderer g++ - test selv med -S) vil ikke generer kode for det inden i if sætningen i nedenstående: static const bool LOG = false; void doLog(string s) { if(LOG) { // skriv log data } }
25. november 2003 - 22:50
#5
men den vil kalde funktionen - selv om den ikke laver noget. Ikke?
25. november 2003 - 22:52
#6
I teorien kan en compiler også tillade sig at fjerne kald til doLog i samme .cpp fil med ovenstående konstruktion. Men jeg tror ikke at mange compilere vil (og g++ gør det tilsyneladende heller ikke med høj O). Compileren kan ikke tillade sig at fjerne doLogs koden helt, fordi så vil kode i andre .cpp filer der kalder den give link fejl. Og den kan selvfølgelig heller ikke optimere kald af doLog væk i andre .cpp filer, fordi den jo ikke kan vide om deLog gør noget eller ej.
25. november 2003 - 22:58
#7
Jeg kan da få den til det med -O4 - her er programmet: tatic const bool LOG = false; void doLog(int s) { if(LOG) { int y = s +99; } } void main() { doLog(101); doLog(102); } og her koden, hvor jeg ikke kan se at doLog bliver kaldt (den gør med -O1) .globl main .type main,@function main: .LFB2: pushl %ebp .LCFI2: xorl %eax, %eax movl %esp, %ebp .LCFI3: popl %ebp ret Jeg tog kun main med - koden for funktionen er der stadig, bliver blot ikke kaldt
25. november 2003 - 23:00
#8
Sådan en optimering er jo "farlig", da der kan være sideeffekter i beregningen af parametrene til den funktion, der fjernes. 101 og 102 har selvfølgelig ikke sideeffekter.
25. november 2003 - 23:10
#9
Jeg får kald med O4, men jeg kalder med STL string hvor du kalder med int, og der er 10 gange så meget kode med STL string !
25. november 2003 - 23:21
#10
Nemlig - og den compiler er en kryster: den tør ikke fjerne det ;))
25. november 2003 - 23:23
#11
Tja. Men i praksis er det vel ret ligegyldigt- de fleste kald vil alligevel være i andre .cpp filer.
25. november 2003 - 23:24
#12
#ifdef er den klassiske C/C++ løsning. Men jeg ville ikke bekymre mig om at lave det kald og runtime test i 98% af tilfældene med hastigheden på dagens computere.
26. november 2003 - 08:51
#13
Hvad får i med: inline void doLog(string s) { if(LOG) { string y = s + "øv"; } } (dur selvfølgelig kun med trivielle functioner). Angående klassisk så er #ifdef DOLOG #define LOG(X) doLog(X) #else #define LOG(X) #endif hvor X ikke må have sideeffekter også klassisk og spare dig for en milliard #if'er.
26. november 2003 - 09:19
#14
g++ har tilsyneladende ikke mget lyst til at inline sådan en (ikke i mit eksempel ihvertfald). Men hvis compileren ville så burde det få det hele optimeret væk.
26. november 2003 - 09:32
#15
Arne> kan det være fordi jeg har lagt en string ind i den og den derfor har en constructor, som ikke er triviel?
26. november 2003 - 10:59
#16
Lyder meget plausibelt.
26. november 2003 - 13:08
#17
arne hvis du vil have point så må du lægge et svar. Erik, er du stadig ikke interreseret i point ? Og i øvrigt tak for en interresant "debat"
26. november 2003 - 13:12
#18
Mnæh - jeg har jo ikke løst noget problem. Makroer er sagen, ikke?
26. november 2003 - 13:53
#19
svar
Kurser inden for grundlæggende programmering