Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

Patrick Egli

Treue Seele

  • »Patrick Egli« ist der Autor dieses Themas

Beiträge: 161

Wohnort: Rainstrasse 38

  • Private Nachricht senden

1

22.04.2008, 18:56

Frage zu Operator

Hallo zusammen

Kann mir jemand sagen, was im folgendem Beispiel und auch allgemein, dieser Operator (?) bedeutet?

C-/C++-Quelltext

1
return fDiff < 0.0f ? 1 : -1;



Ich danke für Antworten


Gruss Patrick

2

22.04.2008, 19:10

Funktioniert ähnlich wie if/else

Wenn der Ausdruck vor dem Fragezeichen wahr ist, dann mache das nach dem Fragezeichen. Andernfalls das nach dem Doppelpunkt.

In deinem Beispiel: Wenn fDiff kleiner ist als 0, dann gebe 1 zurück, ansonsten gebe -1 zurück

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

3

22.04.2008, 21:25

Ein Code sagt mehr als 1000 Worte! :)

C-/C++-Quelltext

1
2
3
4
if ( fDiff < 0.0f )
  return 1;
else
  return -1;


Ist equivalent zu der Kurzschreibweise:

C-/C++-Quelltext

1
return fDiff < 0.0f ? 1 : -1;


Alternativ wäre auch gegangen:

C-/C++-Quelltext

1
return ( fDiff < 0.0f ) * 2 - 1;


;)
@D13_Dreinig

DasBlub

Alter Hase

Beiträge: 802

Wohnort: Schweiz

Beruf: Programmierer

  • Private Nachricht senden

4

24.04.2008, 18:07

Zitat von »"David_pb"«


Alternativ wäre auch gegangen:

C-/C++-Quelltext

1
return ( fDiff < 0.0f ) * 2 - 1;


;)


:lol: :roll: interessant, wie kommt man nur auf solche ideen :D

5

24.04.2008, 20:17

Und ob die Performance das so toll findet ;)
Devil Entertainment :: Your education is our inspiration
Der Spieleprogrammierer :: Community Magazin
Merlin - A Legend awakes :: You are a dedicated C++ (DirectX) programmer and you have ability to work in a team? Contact us!
Siedler II.5 RttR :: The old settlers-style is comming back!

Also known as (D)Evil

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

6

24.04.2008, 22:35

Auf mancher Hardware könnte das sogar schneller sein (z.B. die Cell-SPUs).

7

26.04.2008, 18:04

Das soll schneller sein? Der Vergleich findet bei beiden statt ... nur einmal gibst du sofort was zurück und beim anderen mal wird noch ne Multiplikation un Subtraktion ausgeführt und DANN etwas zurück gegeben ...
Devil Entertainment :: Your education is our inspiration
Der Spieleprogrammierer :: Community Magazin
Merlin - A Legend awakes :: You are a dedicated C++ (DirectX) programmer and you have ability to work in a team? Contact us!
Siedler II.5 RttR :: The old settlers-style is comming back!

Also known as (D)Evil

8

26.04.2008, 19:05

Also zur Performance: Die if/else Variante ist im Prinzip die langsamste, da in der Regel jedes if ein jmp produziert, wobei die Befehlspipeline moderner Prozessoren jedesmal neu aufgebaut werden muessen (Sprungvorhersage mal ausser acht gelassen.

Im Gegensatz dazu ist der dreistellige Operator B ? A1 : A2 eine Zuweisung. Da kann der Compiler schon mehr als bei if/else optimieren. Z.B. kann parallel A1, A2 und B ausgewertet werden ( sind nicht datenabhaengig ). Die Zuweisung kann dann in Abhaengigkeit von B geschehen (muss nicht zwingend ein jmp sein, vielleicht gibts dafuer ja auch einen extra Assemblerbefehl).

Sicher ist die Variante ( fDiff < 0.0f ) * 2 - 1 fuer -1 und 1 schnell, aber nicht allgemein genug. Die einzelnen Teiloperationen sind datenabhaengig und wenn es in den floating point Bereich geht, dann muessen erst die Exponenten "gleichnamig" gemacht werden.

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

9

26.04.2008, 19:41

Zitat von »"knivil"«

Also zur Performance: Die if/else Variante ist im Prinzip die langsamste, da in der Regel jedes if ein jmp produziert, wobei die Befehlspipeline moderner Prozessoren jedesmal neu aufgebaut werden muessen (Sprungvorhersage mal ausser acht gelassen.


Gerade die Sprungvorhersage ist aber ein entscheidender Faktor. Außerdem geht der Trend atm wieder etwas weg von den extrem tiefen Pipelines wie z.b. der P4 sie hatte. Ein falsch vorhergesagter Sprung ist damit auch nichtmehr so schlimm.

Zitat von »"knivil"«

Z.B. kann parallel A1, A2 und B ausgewertet werden ( sind nicht datenabhaengig ).


Das geht leider nicht so einfach, weil C++ garantiert, dass abhängig vom Ergebnis von B nur entweder A1 oder A2 ausgewertet wird. Eine parallele Auswertung wäre also höchstens nur dann möglich wenn sichergestellt ist, dass A1 und A2 frei von Seiteneffekten sind.

Zitat von »"knivil"«

(muss nicht zwingend ein jmp sein, vielleicht gibts dafuer ja auch einen extra Assemblerbefehl).


Ja, sowas gibt's ;)

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

10

26.04.2008, 19:51

Zitat von »"knivil"«


Sicher ist die Variante ( fDiff < 0.0f ) * 2 - 1 fuer -1 und 1 schnell, aber nicht allgemein genug. Die einzelnen Teiloperationen sind datenabhaengig und wenn es in den floating point Bereich geht, dann muessen erst die Exponenten "gleichnamig" gemacht werden.


Zum einen war die letzte Variante eher ein Witz (siehe auch das entprechende Smiley in meinem Post, dass das verdeutlichen soll), zum anderen bezog sich die Frage nicht auf eine allgemeingültige Lösung.
@D13_Dreinig

Werbeanzeige