Variable wird auf booleschen Wert ('True' oder 'False') gesetzt ...



  • Merke: Warnungen sind da um ignoriert zu werden.



  • ChrisM: Dann folge Dimah's Vorschlag. Wie stellst du dir intern die Umwandlung eines int (Ergebnis von &) in ein bool vor? Ein cast nach bool müßte prüfen, ob der int == 0 ist, und ihn dann zurückgeben; andernfalls vorher auf 1 setzen.

    ;; folgender Code ist Spekulation :)
    ;; int steht in eax
      orl %eax,%eax
      jz ende
      movl $1,%eax
    ende:
      ret ;; Rückgabewert implizit in eax
    

    Sieht irgendwie genauso aus wie der Code für einen expliziten Vergleich mit 0.

    !!x ist ein verbreitetes Idiom zur Umwandlung beliebiger Werte in Pseudo-bool (als int) in C, so dass vermutlich viele Compiler den Sinn dahinter "verstehen" und auch optimalen Code generieren können.



  • Original erstellt von ChrisM:
    Naja, ich will halt das alles != 0 true wird und der Rest false, bei möglichst guter Performance!

    ist das ein flaschenhals bei dir?
    weder ein & noch ein != noch ein ! brauchen massiv zeit.
    kann es sein, dass du versuchst zu 'über optimieren'?
    schau dir mal die 20/80 Regel an.

    PS:
    Dimahs Code produziert wahrscheinlich exakt den selben assembler code wie deiner.



  • OK, ich verwende die Lösung von Dimah.

    Normalerweise will ich gar nicht so sehr optimieren, aber da ist es wichtig, weil diese Funktion immer aufgerufen wird, wenn etwas gelesen/geschrieben wird und wenn jetzt z.B. eine 1MB-Textur byteweise ausgelesen wird, soll das auch akzeptabel schnell gehen.

    ChrisM



  • Wie oft fragst du denn bei einer 1MB-Datei ab, ob sie zum lesen oder schreiben geöffnet ist?



  • Warum machst du es überhaupt mit einer Bitmaske? Nimm doch 4 bool variablen



  • *vordenganzengurusimraumniederknieundlobpreisungensing*
    Ich hab ja nicht viel Ahnung, aber wie wäre es denn damit?

    return m_StreamFlags & SF_BINARY & 1;
    


  • das wär Unsinn. Es ist identisch mit dem vorherigen, falls SF_BINARY == 1, sonst konstant 0.



  • Es ist identisch mit dem vorherigen

    Heisst das jetzt, dass es funktioniert oder nicht?

    falls SF_BINARY == 1, sonst konstant 0.

    Das ist doch der Sinn der Sache, oder?



  • OK nochmal langsam:

    Falls SF_BINARY == 1, dann ist

    return m_StreamFlags & SF_BINARY & 1; identisch mit return m_StreamFlags & SF_BINARY;

    Falls SF_BINARY != 1, dann ist

    return m_StreamFlags & SF_BINARY & 1; identisch mit return 0; (ausgehend davon, dass SF_BINARY ein 1-Bit-Flag ist)

    Wo genau ist jetzt deine Verbesserung?

    [ Dieser Beitrag wurde am 25.04.2003 um 15:13 Uhr von Bashar editiert. ]



  • Wie oft fragst du denn bei einer 1MB-Datei ab, ob sie zum lesen oder schreiben geöffnet ist?

    Bei jedem Lese und Schreibzugriff und wenn jetzt die Pixel einzeln ausgelesen werden ... ok, selten dämlich, aber idiotensicher. 🙂

    Warum machst du es überhaupt mit einer Bitmaske? Nimm doch 4 bool variablen

    Weil es noch mehr und später stell ich von den Hexwerten noch auf Bits um und dann kann ich in 4 Byte 32 Statuszustände speichern, sonst bräuchte ich 32 bools = 32 Byte. 😃

    ChrisM



  • Original erstellt von ChrisM:
    [quote]Wie oft fragst du denn bei einer 1MB-Datei ab, ob sie zum lesen oder schreiben geöffnet ist?

    **
    Bei jedem Lese und Schreibzugriff und wenn jetzt die Pixel einzeln ausgelesen werden ... ok, selten dämlich, aber idiotensicher. 🙂
    **[/QUOTE]

    Bist du ein Idiot oder schreiben Idioten an dem Programm mit? Wieso muß es dann idiotensicher sein?



  • Original erstellt von ChrisM:
    Bei jedem Lese und Schreibzugriff

    warum?



  • Na, damit niemand versucht, auf einen Stream, die nur lesen darf, irgendwas zu schreiben.
    Und wenn ich bools verwende und die fülle und abfrage kann ich ja gleich die Flags weglassen. 🙂

    ChrisM



  • dann mach die überprüfung nur in der debug version oder so



  • Die Frage ist eher, warum du eine Texture pixelweise einliest. Es reicht doch, wenn du einmal überprüfst, ob der Stream im richtigen Zustand ist, und dann gleich einen Megabyte-Block auf einmal einliest.



  • So mach ich es ja auch, die Frage ist nur, ob der Benutzer (also der, der die Lib verwendet) das auch so macht. 🙂

    ChrisM



  • Die benutzt eh niemand. :p



  • 😃

    ChrisM



  • Wo genau ist jetzt deine Verbesserung?

    Uups, ich Idiot. 😃 Ich hab verpennt, dass SF_BINARY schon boolean ist. Da hab ich wohl zu schnell geschossen... Es lag halt auf der Hand, dass expr ? true : false == expr & 1.


Anmelden zum Antworten