Avatar billede conrad Nybegynder
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 ?
Avatar billede erikjacobsen Ekspert
25. november 2003 - 22:31 #1
Det første bør compileren se. Du skal dog nok oversætte med -O
Avatar billede bleze Nybegynder
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
Avatar billede erikjacobsen Ekspert
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
Avatar billede arne_v Ekspert
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
  }
}
Avatar billede erikjacobsen Ekspert
25. november 2003 - 22:50 #5
men den vil kalde funktionen - selv om den ikke laver noget. Ikke?
Avatar billede arne_v Ekspert
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.
Avatar billede erikjacobsen Ekspert
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
Avatar billede erikjacobsen Ekspert
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.
Avatar billede arne_v Ekspert
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 !
Avatar billede erikjacobsen Ekspert
25. november 2003 - 23:21 #10
Nemlig - og den compiler er en kryster: den tør ikke fjerne det ;))
Avatar billede arne_v Ekspert
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.
Avatar billede arne_v Ekspert
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.
Avatar billede segmose Nybegynder
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.
Avatar billede arne_v Ekspert
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.
Avatar billede segmose Nybegynder
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?
Avatar billede arne_v Ekspert
26. november 2003 - 10:59 #16
Lyder meget plausibelt.
Avatar billede conrad Nybegynder
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"
Avatar billede erikjacobsen Ekspert
26. november 2003 - 13:12 #18
Mnæh - jeg har jo ikke løst noget problem. Makroer er sagen, ikke?
Avatar billede arne_v Ekspert
26. november 2003 - 13:53 #19
svar
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester