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 Schreibzugriffwarum?
-
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.