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 tema
Cloud & AI
I dette særtema ser vi på, hvordan cloud og AI bliver fundamentet for virksomhedernes digitale forretning, og hvordan de nye muligheder for automatisering og forretningsværdi kan udnyttes uden at miste overblik, sikkerhed og menneskelig kontrol.
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