Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » if und char*

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: [ 1 ] [ 2 ] > 3 < [ 4 ]
020
06.07.2003, 19:13 Uhr
~0xdeadbeef
Gast


ARGH! Es...gibt...keine...bools...in...C! Noch Fragen?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
021
06.07.2003, 19:14 Uhr
Pablo
Supertux
(Operator)


Da kann gut möglich sein, aber der ganze Code, den wir alle gepostet haben, ist C und nicht C++. Da hat @0xdeadbeef recht, bool liefert nur true oder false, und machmal braucht man mehr als true und false, wie im Fall von strcmp.

@Oli: Wenn du in C++ machen willst, dann wäre sinvoll bool zu nehmen. Aber wenn ich eine Variable von typ int oder bool habe, kommt es auf die Größe an?
--
A! Elbereth Gilthoniel!
silivren penna míriel
o menel aglar elenath,
Gilthoniel, A! Elbereth!

Dieser Post wurde am 06.07.2003 um 19:19 Uhr von Pablo Yanez Trujillo editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
022
06.07.2003, 19:39 Uhr
Oliver
S2-Pixelgeneral


Ich meinte ja auch nur wenn man wirklich ein bool hat. Wenn man natürlich mehreres sein kann (nicht nur true und false), dann ist es klar int bzw. short oder was auch immer zu nehmen.

Noch eine Frage: Wenn man jetzt ein "richtiges" bool in C will, kann man doch auch char und nicht int nehmen.

Natürlich ist das jetzt bei den Funktionen egal, aber bei meinem kleinen Beispiel mit dem "RIESEBOOL" wäre es doch sinnvoll oder???
--
Demokratie ist die Diktatur der Mehrheit.

www.siedler25.org/ ( Siedler2 - Remake )
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
023
06.07.2003, 19:51 Uhr
~Bon
Gast


@0xdeadbeef
Ich hab da mal ne Frage, warum Dein Code schneller sein soll,
als der von Virtual, vielleicht hab ich ja das nicht ganz verstanden.

Meiner Meinung nach braucht strcmp() nur viel Zeit,
wenn die beiden Strings ziemlich lang und gleich sind.
In diesem Fall müssen immer beide Ausdrücke ausgewertet werden:
(*s == *t) und && (*s != 0),
die Reihenfolge der beiden Ausdrücke ist also egal.

Nur bei der Abbruchbedingung wird evtl. nur ein Ausdruck ausgewertet.
Bei einem GHz Rechner ist Dein Code dann pro strcmp() Aufruf einige ns schneller, wenn die Strings ungleich sind.
Ob sich da diese Optimierung lohnt ?

Gruß
Bon
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
024
06.07.2003, 20:15 Uhr
~0xdeadbeef
Gast


@Bon: Eine Optimierung ist eine Optmierung, und hier kostet sie ja nichts. Außerdem ist strcmp eine Funktion, die doch recht oft eingesetzt wird, und auf die Dauer läppern sich sogar Nanosekunden zusammen.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
025
06.07.2003, 21:10 Uhr
Pablo
Supertux
(Operator)


@Oli: wie willst du ein richtiges bool in C mit chars machen? Mir fällt nichts ein.

@Bon:

Es geht nicht darum, ob du eine Optiemierung eines Verfahren machst, das schon in O(n) läuft.,Wie @0xdeadbeef schon sagte, eine Optiemierung ist eine Optimierung. Es geht um den Algorithmus. Wenn ich ein Verfahren habe, welches in O(n) liegt, läuft es auch ziemlich schnell. Aber wenn ich das Verfahren optiemieren kann und daruas ein in O(log n) liegendes Verfahren machen kann, ist das super!

Stell dir vor, du hättest ein ganz langes Arrays, und du musst Stelle für Stelle miteinander Vergleichen. Du machst eine Funktion, die in O(n) liegt, aber das Array ist so gross, dass das Verfahren 1024 Jahre (Tagen, Minuten, Sekunden, egal was für eine Einheit) braucht, bis alles fertig ist. Wenn du das Verfahren optimierst in es läuft in O(log n) dann würde nur 10 Jahre (Tage, Minuten, Sekunden, usw.) brauchen, bis alles fertig ist. Also, es hat sich wirklich gelohnt. Es sieht so aus, als hättest du nie mit Programmen die NP-Vollständigkeitsprobleme lösen gearbeitet, dann bist du froh wegen der Optimierung.

Außerdem hängt vom Compiler ab, ob er einen saubern Maschinen Code schriebt oder nicht, es könnte sein, dass für virtual_strcmp() einige NOPs eingefügt werden müssen (wenn RISC) und für die Optimierung keine oder wenige NOPs. Ich hab keine Ahnung, ob das wirklich so ist, da ich beide Verfahre nicht asuprobiert hab und ich kann nicht den compilierten Code schauen.
--
A! Elbereth Gilthoniel!
silivren penna míriel
o menel aglar elenath,
Gilthoniel, A! Elbereth!

Dieser Post wurde am 06.07.2003 um 21:10 Uhr von Pablo Yanez Trujillo editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
026
06.07.2003, 22:49 Uhr
~Bon
Gast


@Oli
Mit folgendem Code kannst Du den Datentyp bool nachbilden.


C++:

#ifndef __cplusplus
  typedef enum {false, true} bool;
#endif




@Pablo
Was ich hier mache ist eigentlich voellig unsinnig,
aber wie es ausssieht habe ich Langeweile.

Ich habe mal den Assembler Code der beiden strcmp Funktionen verglichen,
Ich benutze Visual C 6.0,


Code:

strcmp1:
408:    while(*s && *s==*t)
00402C38   mov         eax,dword ptr [ebp+8]
00402C3B   movsx       ecx,byte ptr [eax]
00402C3E   test        ecx,ecx
00402C40   je          strcmp1+46h (00402c66)
00402C42   mov         edx,dword ptr [ebp+8]
00402C45   movsx       eax,byte ptr [edx]
00402C48   mov         ecx,dword ptr [ebp+0Ch]
00402C4B   movsx       edx,byte ptr [ecx]
00402C4E   cmp         eax,edx
00402C50   jne         strcmp1+46h (00402c66)




Code:

strcmp2:
418:    while(*s == *t && *s)
00402CB8   mov         eax,dword ptr [ebp+8]
00402CBB   movsx       ecx,byte ptr [eax]
00402CBE   mov         edx,dword ptr [ebp+0Ch]
00402CC1   movsx       eax,byte ptr [edx]
00402CC4   cmp         ecx,eax
00402CC6   jne         strcmp2+46h (00402ce6)
00402CC8   mov         ecx,dword ptr [ebp+8]
00402CCB   movsx       edx,byte ptr [ecx]
00402CCE   test        edx,edx
00402CD0   je          strcmp2+46h (00402ce6)



Die Anweisung (*s != 0) benötigt 4 Befehle zur Prüfung
Die Anweisung (*s == *t) benötigt 6 Befehle zur Prüfung

Welche strcmp Funktion schneller ist hängt von den übergebenen Strings ab.

1.) strcmp1 ist um 6 Befehle schneller wenn:

Code:

- String 's' ist ein Leerstring
- String 's' ist kürzer als String 't' und die ersten Zeichen sind identisch
  (String 's' ist Teil von String 't')
- String 's' und String 't' sind identisch



2.)strcmp2 ist um 4 Befehle schneller wenn:

Code:

- String 's' und String 't' sind nicht identisch und
  die Bedingungen unter 1.) treffen nicht zu



Im übrigen verwenden die strcmp Funktionen denselben Algorythmus.
Bei Vergleich von sehr langen Strings ist die Ausführungszeit der Funktionen fast gleich, da nur bei Erkennung eines Abbruchs der while-Schleife ein paar Befehle gespart werden.

Da man ja nicht weiß, welche Strings der Funktion übergeben werden,
würde ich zuerst die kürzere Abbruchbedingung prüfen (*s != 0), denn wenn diese erfüllt ist, spare ich mir die Auswertung der längeren Abbruchbedingung.

Ausserdem wird im Assemblercode *s bei jeder Prüfung der Abbruchbedingungen 2 mal in ein Register geladen. Ich glaube hier würde sich eher eine Optimierung lohnen, da dies bei jedem Schleifendurchlauf geschieht.

PS. Wo stellt man bei Visual C 6.0 eigentlich die Compiler Optimierungsstufe ein ?

Gruß
Bon
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
027
06.07.2003, 23:06 Uhr
~0xdeadbeef
Gast


@Bon: Im Prinzip hast du recht, aber generell kannst du davon ausgehen, dass der Funktion strcmp häufiger nicht identische Strings übergeben werden. Es ist ein bisschen Einschätzungssache, aber ich gehe davon aus, dass strcmp2 im alltäglichen Gebrauch ein bisschen schneller ist.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
028
06.07.2003, 23:18 Uhr
~Bon
Gast


@0xdeadbeef

Mit Deiner Einschätzung könntest Du richtig liegen.
Du sparst somit bei einem 1 GHz Rechner bei 250000000 Aufrufen der Funktion strcmp2 1 Sekunde Zeit im Gegensatz zu strcmp1.

Gruß
Bon
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
029
07.07.2003, 09:54 Uhr
ao

(Operator)



Zitat:
Oliver Müller postete
Noch eine Frage: Wenn man jetzt ein "richtiges" bool in C will, kann man doch auch char und nicht int nehmen.

Natürlich ist das jetzt bei den Funktionen egal, aber bei meinem kleinen Beispiel mit dem "RIESEBOOL" wäre es doch sinnvoll oder???


Kommt drauf an.

Tatsache ist, daß ein standard-konformer C-Compiler boolsche Werte (also Ergebnisse von Vergleichen) im int-Format liefert, was je nach Plattform 16, 32 oder mehr Bits bedeuten kann.

Mit deinem char Riesenbool[1000] sparst du etwas Speicher, verbrauchst aber Laufzeit durch die Umwandlung von int nach char und zurück, wenn du einen Wert im Array speichern oder aus ihm lesen willst.

Das ist wieder ein Beispiel für die Regel "Speicher sparen kostet Laufzeit und umgekehrt", die an vielen Stellen gilt.

Das ist aber alles nur Kleckerkram heutzutage (es sei denn, du programmierst auf einem Mikrokontroller, der nur ein paar MHz und ein paar KBytes RAM hat). Im Sinne eines klaren Software-Designs spricht einiges dafür, mit den "nativen" Datentypen des Compilers und der Plattform zu arbeiten und boolsche Werte nicht in irgendwas zu verklausulieren, wenn sie in Wahrheit int sind.

ao
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: [ 1 ] [ 2 ] > 3 < [ 4 ]     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: